ZonedDateTime

LocalDateTime总是表示本地日期和时间,要表示一个带时区的日期和时间,我们就需要ZonedDateTime

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

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

zoneddatetime\_1.png

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

-09-15T20:58:18.786182+08:00[Asia/Shanghai]
-09-15T08:58:18.788860-04:00[America/New_York]

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

zoneddatetime\_2.png

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

-09-15T15:16:17+08:00[Asia/Shanghai]
-09-15T15:16:17-04:00[America/New_York]

时区转换

要转换时区,首先我们需要有一个ZonedDateTime对象,然后,通过withZoneSameInstant()将关联时区转换到另一个时区,转换后日期和时间都会相应调整。

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

zoneddatetime\_3.png

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

-09-15T21:05:50.187697+08:00[Asia/Shanghai]
-09-15T09:05:50.187697-04:00[America/New_York]

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

-11-15T21:05:50.187697+08:00[Asia/Shanghai]
-11-15T08:05:50.187697-05:00[America/New_York]

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

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

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

ZonedDateTime zdt = ...
LocalDateTime ldt = zdt.toLocalDateTime();

转换为LocalDateTime时,直接丢弃了时区信息。

练习

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

zoneddatetime\_4.png

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

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

小结

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

ZonedDateTimeLocalDateTime可以相互转换。

读后有收获可以支付宝请作者喝咖啡,读后有疑问请加微信群讨论

zoneddatetime\_5.pngzoneddatetime\_6.png

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

results matching ""

    No results matching ""