【问题标题】:EDT or EST? Dynamically set 3 letter timezone based on daylight savings美国东部时间还是美国东部时间?根据夏令时动态设置 3 个字母的时区
【发布时间】:2018-09-07 14:36:50
【问题描述】:

给定 java 中的“EDT”之类的时区,有没有办法在 java 中将任意日期时间设置为该时区并使用正确的标签(EDT 或 EST)打印?

一些上下文:

我正在开发每周报告生成功能,该功能需要在首次配置报告的用户的时区中为报告添加时间戳。我想使用 3 个字母的时区标签(例如“EST”或“CST”)来标记报告,以便用户会看到类似“此报告是在 03-28-2018 12:00:00 pm EDT 生成的消息”。 (我意识到这些可能是模棱两可的。)

报告在服务器上以 pdf 格式生成,因此所有信息必须来自保存在数据库中的报告配置。

现在,当客户发布新的报告配置时,它会在配置中包含三个字母的时区及其偏移量(例如 EDT 的“GMT-0400”),并使用它创建一个 LocalDateTime 并保存偏移,然后用保存的标签打印它。显然这不会考虑夏令时,所以我需要一个更好的解决方案。

作为参考,我在客户端上使用 AngularJS。

【问题讨论】:

  • 从根本上说,如果您可以捕获 IANA 时区,而不是包含模糊的 not-actually-a-time-zone 缩写的配置,您会好多身份证,例如“美国/纽约”。从那里,您可以随时为您想要的任何时刻找到正确的缩写。我们没有太多关于如何创建报告的背景信息,但是有很多选项可以在各种环境中检测时区。

标签: java spring timezone


【解决方案1】:

事实证明,我的问题需要一个客户端解决方案,基于 cmets 和 this 问题,我使用 moment.js moment.tz.guess(); 获取配置新报告时包含的 IANA 时区。

一旦服务器知道 IANA 时区,创建分区日期时间就很简单了:

String timezone = "America/New_York";
ZonedDateTime timestamp = ZonedDateTime.now().withZoneSameInstant(ZoneId.of(timezone));

【讨论】:

    猜你喜欢
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多