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还提供了不同时区和历法的获取方法,由于较少使用而且不易于理解,这里不再列出。😕

