Java 8之前的库对日期和时间的支持并不理想,为了解决这个问题,Java 8引入了一套全新的时间日期API,位于java.time
路径下。
LocalDate
LocalDate
类型包含了年月日信息,下面举些LocalDate
的使用示例:
1 | LocalDate date = LocalDate.of(2018, 4, 20); // 2018-04-20 |
可以使用LocalDate.now()
获取当天的日期信息:
1 | // 查看当天 年月日 |
除了调用LocalDate
的getYear
方法外,我们也可以使用ChronoField
枚举类型来实现相同的功能:
1 | int year1 = date.get(ChronoField.YEAR); // 2018 |
ChronoField
枚举类型包含了诸多的属性可供选择:
我们也可以修改LocalDate
对象:
1 | LocalDate date3 = LocalDate.of(2018, 4, 20); // 2018-04-20 |
TemporalAdjusters
类提供了许多静态方法来修改LocalDate
对象。当我们需要获取下一个周天,下一个工作日,本月的最后一天等信息时,TemporalAdjusters
类便可派上用场:
1 | import static java.time.temporal.TemporalAdjusters.*; |
可参考4月的日历来理解上面的结果:
我们还可以对LocalDate
进行格式化操作:
1 | String str1 = date.format(DateTimeFormatter.BASIC_ISO_DATE); // 20180420 |
LocalDate和下面要介绍的LocalTime,LocalDateTime之间共享了许多类似的方法,上面介绍的LocalDate修改、格式化等方法通用适用于LocalTime和LocalDateTime。
LocalTime
LocalTime
和LocalDate
类似,区别在于LocalTime
包含的是时分秒(毫秒)信息。举些LocalTime
的例子:
1 | LocalTime time = LocalTime.of(20, 13, 54); // 20:13:54 |
LocalDate
和LocalTime
都可以通过字符串来创建:
1 | LocalDate date = LocalDate.parse("2018-04-20"); |
LocalDateTime
LocalDateTime
是LocalDate
和LocalTime
的组合形式,包含了年月日时分秒信息。举些LocalDateTime
的使用示例:
1 | LocalDateTime ldt1 = LocalDateTime.of(2018, 4, 20, 20, 13, 54); // 2018-04-20T20:13:54 |
LocalDateTime
可以转换为LocalDate
和LocalTime
,转换后包含的信息减少了:
1 | LocalDate date1 = ldt1.toLocalDate(); // 2018-04-20 |
同样的,LocalDate
和LocalTime
也可以转换为LocalDateTime
,只需要补上日期或者时间:
1 | LocalDateTime ldt3 = date.atTime(time); // 2018-04-20T20:13:54 |
Duration
Duration
用于计算两个LocalTime
或者LocalDateTime
的时间差,例如:
1 | LocalTime time2 = LocalTime.of(23, 59, 59); |
time1和time2之间相差了13565秒。
手动创建Duration
对象:
1 | Duration threeMinutes = Duration.ofMinutes(3); |
Period
Period
用于计算两个LocalDate
之间的时长。举些例子:
1 | LocalDate date2 = LocalDate.of(2018, 5, 21); |
2018-04-21和2018-04-20之间月份相差1,天数相差1。
同样的,我们也可以手动创建Period
对象:
1 | Period tenDays = Period.ofDays(10); |
其他一些常用的方法
比较两个时间的先后
1 | LocalDate date15 = LocalDate.of(2018,4,21); |
MonthDay类的使用
MonthDay
只包含月日信息,可以用于存放类似于生日,结婚纪念日等信息。举个使用MonthDay
的例子:
1 | LocalDate birthday = LocalDate.of(1999, 9, 9); |
假如用户的生日是1999年9月9号,那么可以通过这种方法来判断今天是否是用户的生日,如果是的话便发送生日祝福。同样的也有YearMonth
类。
Java 8 新的日期时间API还提供了不同时区和历法的获取方法,由于较少使用而且不易于理解,这里不再列出。😕