时间:2021-05-19
在JDK8之前,处理日期时间,我们主要使用3个类, Date 、 SimpleDateFormat 和 Calendar 。
这3个类在使用时都或多或少的存在一些问题,比如 SimpleDateFormat 不是线程安全的,
比如 Date 和 Calendar 获取到的月份是0到11,而不是现实生活中的1到12,关于这一点,《阿里巴巴Java开发手册》中也有提及,因为很容易犯错:
不过,JDK8推出了全新的日期时间处理类解决了这些问题,比如 Instant 、 LocalDate 、 LocalTime 、 LocalDateTime 、 DateTimeFormatter ,在《阿里巴巴Java开发手册》中也推荐使用 Instant 、
LocalDateTime 、 DateTimeFormatter :
但我发现好多项目中其实并没有使用这些类,使用的还是之前的 Date 、 SimpleDateFormat 和 Calendar ,所以本篇博客就讲解下JDK8新推出的日期时间类,主要是下面几个:
既然 Instant 可以代替 Date 类,那它肯定可以获取当前时间:
Instant instant = Instant.now();System.out.println(instant);输出结果:
2020-06-10T08:22:13.759Z
细心的你会发现,这个时间比北京时间少了8个小时,如果要输出北京时间,可以加上默认时区:
System.out.println(instant.atZone(ZoneId.systemDefault()));输出结果:
2020-06-10T16:22:13.759+08:00[Asia/Shanghai]
输出结果:
1591777752
1591777752613
当然,也可以通过 System.currentTimeMillis() 获取当前毫秒数。
1)根据秒数时间戳转换:
Instant instant = Instant.now();System.out.println(instant);long epochSecond = instant.getEpochSecond();System.out.println(Instant.ofEpochSecond(epochSecond));System.out.println(Instant.ofEpochSecond(epochSecond, instant.getNano()));输出结果:
2020-06-10T08:40:54.046Z
2020-06-10T08:40:54Z
2020-06-10T08:40:54.046Z
2)根据毫秒数时间戳转换:
Instant instant = Instant.now();System.out.println(instant);long epochMilli = instant.toEpochMilli();System.out.println(Instant.ofEpochMilli(epochMilli));输出结果:
2020-06-10T08:43:25.607Z
2020-06-10T08:43:25.607Z
输出结果:
秒时间戳:1591778815
豪秒时间戳:1591778815967
纳秒:967000000
如果字符串格式不对,比如修改成 2020-06-10T08:46:55.967 ,就会抛出 java.time.format.DateTimeParseException 异常,如下图所示:
使用 LocalDate 获取当前日期非常简单,如下所示:
LocalDate today = LocalDate.now();System.out.println("today: " + today);输出结果:
today: 2020-06-10
不用任何格式化,输出结果就非常友好,如果使用 Date ,输出这样的格式,还得配合 SimpleDateFormat 指定 yyyy-MM-dd 进行格式化,一不小心还会出个bug,比如去年年底很火的1个bug,我当时还是截了图的:
这2个好友是2019/12/31关注我的,但我2020年1月2号查看时,却显示成了2020/12/31,为啥呢?格式化日期时格式写错了,应该是 yyyy/MM/dd ,却写成了 YYYY/MM/dd ,刚好那周跨年,就显示成下一年,也就是2020年了,当时好几个博主写过文章解析原因,我这里就不做过多解释了。
划重点:都说到这了,给大家安利下我新注册的公众号「申城异乡人」,欢迎大家关注,更多原创文章等着你哦,哈哈。
输出结果:
year: 2020
month: 6
day: 10
获取月份终于返回1到12了,不像 java.util.Calendar 获取月份返回的是0到11,获取完还得加1。
输出结果:
specifiedDate: 2020-06-01
如果确定月份,推荐使用另一个重载方法,使用枚举指定月份:
LocalDate specifiedDate = LocalDate.of(2020, Month.JUNE, 1);输出结果:
localDate1 equals localDate2
输出结果:
Today:2020-06-11
Today is:THURSDAY
今天是本周的第4天
今天是本月的第11天
今天是本年的第163天
输出结果:
2020 is leap year:true
如果使用 java.util.Date ,那代码是下面这样的:
Date date = new Date();int hour = date.getHours();int minute = date.getMinutes();int second = date.getSeconds();System.out.println("hour: " + hour);System.out.println("minute: " + minute);System.out.println("second: " + second);输出结果:
注意事项:这几个方法已经过期了,因此强烈不建议在项目中使用:
如果使用 java.util.Calendar ,那代码是下面这样的:
Calendar calendar = Calendar.getInstance();// 12小时制int hourOf12 = calendar.get(Calendar.HOUR);// 24小时制int hourOf24 = calendar.get(Calendar.HOUR_OF_DAY);int minute = calendar.get(Calendar.MINUTE);int second = calendar.get(Calendar.SECOND);int milliSecond = calendar.get(Calendar.MILLISECOND);System.out.println("hourOf12: " + hourOf12);System.out.println("hourOf24: " + hourOf24);System.out.println("minute: " + minute);System.out.println("second: " + second);System.out.println("milliSecond: " + milliSecond);输出结果:
注意事项:获取小时时,有2个选项,1个返回12小时制的小时数,1个返回24小时制的小时数,因为现在是晚上8点,所以 calendar.get(Calendar.HOUR) 返回8,而 calendar.get(Calendar.HOUR_OF_DAY) 返回20。
如果使用 java.time.LocalTime ,那代码是下面这样的:
LocalTime localTime = LocalTime.now();System.out.println("localTime:" + localTime);int hour = localTime.getHour();int minute = localTime.getMinute();int second = localTime.getSecond();System.out.println("hour: " + hour);System.out.println("minute: " + minute);System.out.println("second: " + second);输出结果:
可以看出,LocalTime只有时间没有日期。
输出结果:
localDateTime: 2020-06-11T11:03:21.376
输出结果:
输出结果:
localDateTime: 2020-06-11T11:13:44.979
tomorrow: 2020-06-12T11:13:44.979
nextHour: 2020-06-11T12:13:44.979
LocalDateTime 还提供了添加年、周、分钟、秒这些方法,这里就不一一列举了:
输出结果:
localDateTime: 2020-06-11T11:20:38.896
yesterday: 2020-06-10T11:20:38.896
lastHour: 2020-06-11T10:20:38.896
类似的, LocalDateTime 还提供了减少年、周、分钟、秒这些方法,这里就不一一列举了:
输出结果:
localDateTime: 2020-06-11T11:32:31.731
DayOfWeek: 4
DayOfYear: 163
JDK8中推出了 java.time.format.DateTimeFormatter 来处理日期格式化问题,《阿里巴巴Java开发手册》中也是建议使用 DateTimeFormatter 代替 SimpleDateFormat 。
输出结果:
如果提供的格式无法满足你的需求,你还可以像以前一样自定义格式:
LocalDate localDate = LocalDate.now();System.out.println("yyyy/MM/dd: " + localDate.format(DateTimeFormatter.ofPattern("yyyy/MM/dd")));输出结果:
yyyy/MM/dd: 2020/06/11
输出结果:
14:28:35.230
ISO_TIME: 14:28:35.23
HH:mm:ss: 14:28:35
输出结果:
2020-06-11T14:33:18.303
ISO_DATE_TIME: 2020-06-11T14:33:18.303
ISO_DATE: 2020-06-11
JDK8中, Date 新增了 from() 方法,将 Instant 转换为 Date ,代码如下所示:
Instant instant = Instant.now();System.out.println(instant);Date dateFromInstant = Date.from(instant);System.out.println(dateFromInstant);输出结果:
2020-06-11T06:39:34.979Z
Thu Jun 11 14:39:34 CST 2020
JDK8中, Date 新增了 toInstant 方法,将 Date 转换为 Instant ,代码如下所示:
Date date = new Date();Instant dateToInstant = date.toInstant();System.out.println(date);System.out.println(dateToInstant);输出结果:
Thu Jun 11 14:46:12 CST 2020
2020-06-11T06:46:12.112Z
输出结果:
Thu Jun 11 14:51:07 CST 2020
2020-06-11T14:51:07.904
输出结果:
Thu Jun 11 14:59:38 CST 2020
2020-06-11
可以看出, Date 是先转换为 Instant ,再转换为 LocalDateTime ,然后通过 LocalDateTime 获取 LocalDate 。
输出结果:
Thu Jun 11 15:06:14 CST 2020
15:06:14.531
可以看出, Date 是先转换为 Instant ,再转换为 LocalDateTime ,然后通过 LocalDateTime 获取 LocalTime 。
输出结果:
2020-06-11T15:12:11.600
Thu Jun 11 15:12:11 CST 2020
输出结果:
Thu Jun 11 00:00:00 CST 2020
输出结果:
Thu Jun 11 15:24:18 CST 2020
JDK8推出了全新的日期时间类,如 Instant 、 LocaleDate 、 LocalTime 、 LocalDateTime 、 DateTimeFormatter ,设计比之前更合理,也是线程安全的。
《阿里巴巴Java开发规范》中也推荐使用 Instant 代替 Date , LocalDateTime 代替 Calendar , DateTimeFormatter 代替 SimpleDateFormat 。
因此,如果条件允许,建议在项目中使用,没有使用的,可以考虑升级下。
到此这篇关于JDK8中日期类型该如何使用详解的文章就介绍到这了,更多相关JDK8 日期类型内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
java8、jdk8日期转化成字符串新建日期工具类:DateUtils新建方法:parseDate实现方法parseDatepublicstaticString
1.1JDK14详细概述JDK8已经在2014年3月18日正式可用,JDK8作为长期支持(Long-Term-Support)版本,距离现在已经5年多时间过去了
JDK8的新特性中TimeAPI,其包括Clock、Duration、Instant、LocalDate、LocalTime、LocalDateTime、Zon
详解Java中日期数据类型的处理之格式转换的实例概要:日期以及时间格式处理,在Java中时间格式一般会涉及到的数据类型包括Calendar类和Date类。Dat
JDK8已发布,写了一个datetime时间函数使用方法的小示例复制代码代码如下:packagedatetime;importstaticjava.time.t