引言
在Java 8 之前的版本中,时间处理一直是备受吐槽的点,比如早期的Date、Calendar等类库。
最早的jdk 1.0版本,Date类创建时间非常不直观,并且toString方法返回的字符串也很容易误导人,返回的值包含了JVM默认时区CET,即中欧时间(Central Europe Time)。但这并不表示Date类在任何方面支持时区。随着1.0退出历史舞台,1.1牺牲了前向兼容性,废弃了很多Date中的方法,并且推出了Calendar取而代之。但Calendar还是有很多问题和设计缺陷,比如月份还是从0开始,DateFormat也不是线程安全的,还有就是Date和Calendar本身就比较混淆,到底应该用哪一种呢?程序员也会很困惑,最后他们本身都是可变的,这种设计会将你拖入维护的噩梦。
于是在这个背景下,joda-time成了很多程序员的选择,纷纷转向了joda-time。
为了解决这些问题,Oracle决定在原生的Java API中提供高质量的日期和时间支持,所以Java 8推出了java.time包,所以Java 8推出的时间类库也是大量整合了joda-time中的特性。
1.1 创建日期&时间
使用LocalDate、LocalTime、LocalDateTime
我们来看一下java.time提供的新api是如何创建一个日期或者时间的。
注意一下,DateTimeFormatter是一个很强大的功能,可以自定义pattern,并且线程安全。
在工具类中,可以通过正则表达式+DateTimeFormatter组合,支持多pattern的自动匹配parse。
LocalDate LocalTime LocalDateTime1.2 获取日期&时间年月日时分秒信息
LocalDate、LocalTime、LocalDateTime三者api高度相似,所以不一一列举了。
api1.3 时间的比较
时间的比较也是比较常见的操作,我们看一下如何使用。
compare非常简单,提供有各种api支持时间对比。
1.4 时间的输出
时间输出有两种。
1.默认标准pattern(toString)
2.自定义pattern(format)
format toString可以看到,还是可以借助DateTimeFormatter做自定义格式的输出。
1.5 LocalDate、LocalTime、LocalDateTime相互转换
translate1.6 Duration&Period
这两个概念程序员应该都很熟悉,是一种between的概念,表示一个区间段。
1.7 操纵日期&时间
主要是一些plus、minus、with等操作
1.8 时区处理
添加时区
计算时区
1.9 TemporalAdjuster接口
TemporalAdjuster是一个FunctionalInterface接口,用来定制更灵活的时间处理需求,比如下面这个例子,我们计算下一个工作日是几号。
网友评论