java - 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 月失败)
解决方案
3 月 14 日星期日,夏令时开始于America/New_York
. 我想这是观察到差异的原因。
夏令时America/New_York
开始于2021-03-14T02:00:00 EST
。也就是说,在此之后的任何日期时间实例(直到冬季时间再次生效)的时区America/New_York
都将是 EDT 而不是 EST。EDT 的 UTC 偏移量为 -4 小时。
推荐阅读
- node.js - TypeScript 在 Node.js 依赖项中找不到命名空间
- asp.net - MSSQL 和 EntityFramework - 存储和读取 UTC 日期时间
- python - 我的程序运行良好,但我不明白为什么?与函数和嵌套列表有关
- julia - Julia Roots find_zero 与 ForwardDiff.Dual 类型?
- reactjs - 如何在 AWS API(graphQL) 中创建连接
- reporting-services - SSRS 如何按外部组行摘要划分行结果
- java - 处理 EntityNotFoundException
- pdf - Ghostscript - 从 pdf 创建 png 时指定输出大小
- vue.js - 如何在 nextcloud/vue 中获取文件路径
- vaadin - 如何防止 Vaadin Flow 中的选项卡选择更改