电脑@如何处理计算机中的日期和时间问题?( 五 )


除此之外 , 我们还可以通过 of() 函数指定日期和时间创建 LocalDateTime:
电脑@如何处理计算机中的日期和时间问题?
本文插图
LocalDateTime 存储了当前的日期信息和时间信息 , 如果我们只需要当前日期或当前时间 , 可以使用 LocalDate 和 LocalTime:
电脑@如何处理计算机中的日期和时间问题?
本文插图
同 LocalDateTime 类一样 , LocalDate 和 LocalTime 类也可以通过 now()、parse()、of() 方法创建 。
LocalDateTime 在加减日期时 , 可以采用简洁的链式调用:
电脑@如何处理计算机中的日期和时间问题?
本文插图
和 Calendar 一样 , LocalDateTime 在加减时 , 仍然会自动调整日期:
电脑@如何处理计算机中的日期和时间问题?
本文插图
与 Calendar 不同的是 , LocalDateTime 是不可变类 , 如此例中调用 minusMonths(1) 和 plusMonths(1) 方法后 , dt 的值并没有改变 , 这个函数返回的是一个调整后的新值 , 我们将这个新值赋值给了 dt2 。
对应 Calendar 的 set() 方法 , LocalDateTime 调整时间使用 withXxx() 方法:

  • 调整年:withYear()
  • 调整月:withMonth()
  • 调整日:withDayOfMonth()
  • 调整时:withHour()
  • 调整分:withMinute()
  • 调整秒:withSecond()

电脑@如何处理计算机中的日期和时间问题?
本文插图
LocalDateTime 还有一个 with() 方法允许我们做更复杂的运算:
电脑@如何处理计算机中的日期和时间问题?
本文插图
要比较两个日期的先后 , 可以使用 LocalDateTime 的 isBefore()、isAfter() 方法:
电脑@如何处理计算机中的日期和时间问题?
本文插图
4.2. ZonedDateTime LocalDateTime 和 Date 类一样 , 总是表示本地时区的时间 , 如果要表示带时区的时间 , 需要使用 ZonedDateTime , 它相当于 LocalDateTime + ZoneId 。 LocalDateTime 提供的方法 , 如 now()、of()、plusDays() 等 , ZonedDateTime 也都提供 。
ZonedDateTime 的使用:
电脑@如何处理计算机中的日期和时间问题?
本文插图
ZonedDateTime 通过 now() 函数获取当前时区的时间 , 通过 now(ZoneId zone) 函数获取指定时区的时间 。 这样获取到的两个时间虽然时区不同 , 但表示的都是同一时刻(毫秒数不同是由于执行代码会花费一点时间) 。
通过给 LocalDateTime 设置 ZoneId , 也可以创建出 ZonedDateTime:
电脑@如何处理计算机中的日期和时间问题?
本文插图
通过这种方式创建的 ZonedDateTime 日期和时间一样 , 但时区不同 , 所以表示的是两个不同时刻 。
ZonedDateTime 可以通过 toLocalDateTime() 函数转换成 LocalDateTime:
电脑@如何处理计算机中的日期和时间问题?
本文插图
我们看到 , ZonedDateTime 转换成 LocalDateTime 时 , 不会自动切换成本地时区的时间 , 而是直接丢弃时区信息 。
由于 ZonedDateTime 自带时区信息 , 所以在涉及时区转换时使用 ZonedDateTime 非常方便 。 如上文中提到的将纽约时间转换成的东京时间 , 使用 ZonedDateTime 实现如下:


推荐阅读