ZonedDateTime

    可以简单地把ZonedDateTime理解成LocalDateTimeZoneIdZoneIdjava.time引入的新的时区类,注意和旧的java.util.TimeZone区别。

    要创建一个对象,有以下几种方法,一种是通过now()方法返回当前时间:

    观察打印的两个ZonedDateTime,发现它们时区不同,但表示的时间都是同一时刻(毫秒数不同是执行语句时的时间差):

    另一种方式是通过给一个LocalDateTime附加一个ZoneId,就可以变成ZonedDateTime

    ZonedDateTime - 图1

    以这种方式创建的ZonedDateTime,它的日期和时间与LocalDateTime相同,但附加的时区不同,因此是两个不同的时刻:

    下面的代码演示了如何将北京时间转换为纽约时间:

    要特别注意,时区转换的时候,由于夏令时的存在,不同的日期转换的结果很可能是不同的。这是北京时间9月15日的转换结果:

    这是北京时间11月15日的转换结果:

    两次转换后的纽约时间有1小时的夏令时时差。

    涉及到时区时,千万不要自己计算时差,否则难以正确处理夏令时。

    有了ZonedDateTime,将其转换为本地时间就非常简单:

    某航线从北京飞到纽约需要13小时20分钟,请根据北京起飞日期和时间计算到达纽约的当地日期和时间。

    ZonedDateTime - 图2

    提示:ZonedDateTime仍然提供了plusDays()等加减操作。

    下载练习: (推荐使用IDE练习插件快速下载)

    ZonedDateTime是带时区的日期和时间,可用于时区转换;

    ZonedDateTime和可以相互转换。

    ZonedDateTime - 图3