按照之前说的,今天总结一下时间相关的类和方法。
在使用Java 8 之前,大家应该使用过 Joda Time Library 吧。Java 8 中的时间相关类就是源于这个Lib
废话不多说,开始总结一下。
这里说的package为Java 8 及以上中的 java.time package, 讨论其中的相关class和方法
为何引入新的时间包
既然引入新的,那说明老的不好用呗。
其新特点在于:
- 线程安全,按照源码注解所示:This class is immutable and thread-safe
- 很容易使用,方法更容易理解,更适合人类常规使用习惯和思维方式
- 更好的时区处理和支持
LocalDate
名字很直接,当地日期,基于系统时钟获得
1 | LocalDate localDate = LocalDate.now(); |
如何format也是大家经常使用的功能
1 | localDate.format(DateTimeFormatter.ISO_DATE); |
还是很容易的,可以使用系统已经预置的format格式或者自己自定义,或者可以使用DateTimeFormatterBuilder进行更复杂的自定义
时间解析也是很直观
1 | LocalDate.of(2021, 07, 24); |
日期的计算
1 | LocalDate tomorrow = LocalDate.now().plusDays(1); |
常用的方法
1 | LocalDate.now().getDayOfMonth(); |
日期比较
1 | boolean notBefore = LocalDate.parse("2021-07-12").isBefore(LocalDate.parse("2021-07-11")); |
其它
1 | LocalDate.now().atStartOfDay(); |
LocalTime
和上面用法基本类似
1 | LocalTime.now(); |
解析时间
1 | LocalTime.of(6, 30); |
时间计算
1 | LocalTime.now().plus(1, ChronoUnit.HOURS); |
获取和比较
1 | LocalTime.now().getHour(); |
LocalDateTime
哈哈,内容基本重复了,同上类似,不再赘述了
1 | LocalDateTime.now(); |
其它的自己看吧,不列了
ZonedDateTime & OffsetDateTime
用于通过时区和时间偏移方式来支持跨时区的时间操作
1 | Set<String> allZoneIds = ZoneId.getAvailableZoneIds(); |
OffsetDateTime 感觉和使用ZonedDateTime类似,一个用时区,一个用偏移量
1 | LocalDateTime now = LocalDateTime.now(); |
关于时间格式化样式字符串,发现还是有个很复杂的标准,目前只知道常用的表达,其它格式详细可以参见Wiki
P.S.之前寻找国家语言等代码也是通过Wiki来找到相应的标准
Period and Duration
用于支持日期和时间的区间计算
例如获得两localDate之间的天数
1 | Period.between(initialDate, finalDate).getDays(); |
获得两个time时间的秒数或分钟数
1 | Duration.between(initialTime, finalTime).getSeconds(); |
EpochSecond
这个值的处理应该是很常用的,我们在传递数据是还是用原点时间戳数值比较多
但是要注意的是,时间戳数值并没有表明时区,但按照Unix系统的定义,我们应该使用UTC时区为基准,计算时间戳,所以都是基于UTC时间转换出的数值
你可以使用此工具进行查看epoch converter
如下,同一个时间戳数值,通过不同的offset获得不同时区的localDateTime
1 | LocalDateTime utcDateTime = LocalDateTime.ofEpochSecond(Instant.now().getEpochSecond(), 0, ZoneOffset.UTC); |
或者通过ZonedDateTime
1 | Instant nowUtc = Instant.now(); |
总结
看似简单的时间类,其实还是有很多细节值得注意的
还一些不错的方法这里没有一一列出.
对于时区和时间戳部分,引发了一些思考,还是有收获的