首页 > 解决方案 > ZonedDateTime 到 java.util.Date -> EST 到 UTC - 关闭 1 小时

问题描述

我正在尝试将 ZonedDateTime (EST) 转换为 Date (UTC) 我看到 3 月 13 日和 14 日有 1 小时的休息时间

系统默认值 - UTC

ZonedDateTime zonedDateTime1 = ZonedDateTime.of(2021, 3, 13, 19, 0, 0, 0, ZoneId.of("America/New_York")); 

Date date1 = Date.from(zonedDateTime1.withZoneSameInstant(ZoneId.systemDefault()).toInstant();

System.out.println("EST -> ", zonedDateTime1);
System.out.println("UTC -> ", date1);

ZonedDateTime zonedDateTime2 = ZonedDateTime.of(2021, 3, 14, 19, 0, 0, 0, ZoneId.of("America/New_York")); 

Date date2 = Date.from(zonedDateTime2.withZoneSameInstant(ZoneId.systemDefault()).toInstant();
 
System.out.println("EST -> ", zonedDateTime2);
System.out.println("UTC -> ", date2);

实际结果
EST -> 2021-03-13T19:00-05:00[America/New_York]
UTC -> Sun Mar 14 00:00:00 UTC 2021
EST -> 2021-03-14T19:00-04:00[ America/New_York]
UTC -> 2021 年 3 月 14 日星期日 23:00:00 UTC

预期结果
EST -> 2021-03-13T19:00-05:00[America/New_York]
UTC -> Sun Mar 14 00:00:00 UTC 2021
EST -> 2021-03-14T 19:00-04:00 [America/New_York]
UTC -> 2021 年 3 月 15 日星期一 00:00:00 UTC

这是业务用例

-> 客户特定假期 2021/1/14、2021/2/14、2021/3/14(以 UTC 表示)

-> 用户选择一个具体的时间 eg: 2021/2/14 19:00, 2021/3/14 19:00 EST (这两天是实际工作日)

现在系统说用户选择的日期是客户的假期或工作日

为此,我将用户选择的日期(EST)转换为 UTC 并检查客户特定的日历(它适用于 2 月,但 3 月失败)

标签: javadatedatetimeutczoneddatetime

解决方案


3 月 14 日星期日,夏令时开始于America/New_York. 我想这是观察到差异的原因。

夏令时America/New_York开始于2021-03-14T02:00:00 EST。也就是说,在此之后的任何日期时间实例(直到冬季时间再次生效)的时区America/New_York都将是 EDT 而不是 EST。EDT 的 UTC 偏移量为 -4 小时。


推荐阅读