plusMonths
返回此副本LocalDate添加了几个月的指定数目。
此方法将分三步指定金额的几个月字段:
- 将输入的月数加到month-of-year字段
- 校验结果日期是否无效
- 调整 day-of-month ,如果有必要的最后有效日期
例如,2007-03-31加一个月会导致无效日期2007年4月31日。并非返回一个无效结果,而是 2007-04-30才是最后有效日期。调用实例的不可变性不会被该方法影响。
当天的零点、结束时间
// 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
- 也有将字符串作为参数的解析方法。
getter约定
- 为了从Java SE 8类获取值,使用了标准的Java getter约定,如下
更改对象值
也可以更改对象值以执行计算。因为新API中所有核心类都是不可变的,所以将调用这些方法with并返回新对象,而不是使用setter。也有基于不同字段的计算方法。
调整器
新的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”之类的字符串,则应改用该域类。一个示例用例是存储用户对其时区的偏好。
ZoneOffset
是格林威治/ UTC与时区之间的差异的时间段。可在特定的ZoneId
,在特定时间被解析,如清单7所示。
ZoneOffset offset = ZoneOffset.of("+2:00");