且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

告别jodatime!拥抱Java8日期时间类LocalDate、LocalDateTime详解(中)

更新时间:2021-10-27 22:26:58

plusMonths

返回此副本LocalDate添加了几个月的指定数目。

此方法将分三步指定金额的几个月字段:


  • 将输入的月数加到month-of-year字段
  • 校验结果日期是否无效
  • 调整 day-of-month ,如果有必要的最后有效日期


例如,2007-03-31加一个月会导致无效日期2007年4月31日。并非返回一个无效结果,而是 2007-04-30才是最后有效日期。调用实例的不可变性不会被该方法影响。

告别jodatime!拥抱Java8日期时间类LocalDate、LocalDateTime详解(中)


当天的零点、结束时间

// 2021-06-30 00:00:00
LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
String formatString = todayStart.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
// 2021-06-30 23:59:59
LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
formatString = todayEnd.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

4 创建对象

工厂方法


新API中的所有核心类都是通过熟练的工厂方法构造。

  • 当通过其构成域构造值时,称为工厂of
  • 从其他类型转换时,工厂称为from
  • 也有将字符串作为参数的解析方法。

告别jodatime!拥抱Java8日期时间类LocalDate、LocalDateTime详解(中)


getter约定

  • 为了从Java SE 8类获取值,使用了标准的Java getter约定,如下
  • 告别jodatime!拥抱Java8日期时间类LocalDate、LocalDateTime详解(中)

更改对象值

也可以更改对象值以执行计算。因为新API中所有核心类都是不可变的,所以将调用这些方法with并返回新对象,而不是使用setter。也有基于不同字段的计算方法。

告别jodatime!拥抱Java8日期时间类LocalDate、LocalDateTime详解(中)


调整器


新的API还具有调整器的概念—一块代码块,可用于包装通用处理逻辑。可以编写一个WithAdjuster,用于设置一个或多个字段,也可编写一个PlusAdjuster用于添加或减去某些字段。值类还可以充当调节器,在这种情况下,它们将更新它们表示的字段的值。内置调节器由新的API定义,但是如果您有想要重用的特定业务逻辑,则可以编写自己的调节器。


import static java.time.temporal.TemporalAdjusters.*;

LocalDateTime timePoint = ...
foo = timePoint.with(lastDayOfMonth());
bar = timePoint.with(previousOrSame(ChronoUnit.WEDNESDAY));

// 使用值类作为调整器
timePoint.with(LocalTime.now()); 

5 截断

新的API通过提供表示日期,时间和带时间的日期的类型来支持不同的精确度时间点,但是显然,精确度的概念比此精确度更高。

该truncatedTo方法存在支持这种使用情况下,它可以让你的值截断到字段,如下

LocalTime truncatedTime = time.truncatedTo(ChronoUnit.SECONDS);


6 时区


我们之前查看的本地类抽象了时区引入的复杂性。时区是一组规则,对应于标准时间相同的区域。大约有40个。时区由它们相对于协调世界时(UTC,Coordinated Universal Time)的偏移量定义。它们大致同步移动,但有一定差异。


时区可用两个标识符来表示:缩写,例如“ PLT”,更长的例如“ Asia / Karachi”。在设计应用程序时,应考虑哪种情况适合使用时区,什么时候需要偏移量。


ZoneId是区域的标识符。每个ZoneId规则都对应一些规则,这些规则定义了该位置的时区。在设计软件时,如果考虑使用诸如“ PLT”或“ Asia / Karachi”之类的字符串,则应改用该域类。一个示例用例是存储用户对其时区的偏好。


告别jodatime!拥抱Java8日期时间类LocalDate、LocalDateTime详解(中)


  • ZoneOffset是格林威治/ UTC与时区之间的差异的时间段。可在特定的ZoneId,在特定时间被解析,如清单7所示。


ZoneOffset offset = ZoneOffset.of("+2:00");