【问题标题】:Java time ignores daylight saving rulesJava 时间忽略夏令时规则
【发布时间】:2018-08-22 16:07:05
【问题描述】:

我正在以 POSIX 格式导出 TZ 变量以在 Linux 上设置时区。例如:

export TZ="EST+5EDT,M3.2.0/02:00,M11.1.0/02:00"

Linux date 命令返回:

2018 年 3 月 14 日星期三 03:47 EDT

Java ZonedDateTime.now() 返回:

2018-03-14T02:47:36.808[GMT-05:00]

Java 似乎没有考虑夏令时规则。有什么问题?

【问题讨论】:

  • ZoneId.systemDefault() 返回的是什么?
  • 猜测一下,您的 JVM 不会尝试解析第一个逗号之后的任何内容。例如TZ="EST+5EDT,I'm a little teapot" 产生与TZ="EST+5EDT,M3.2.0/02:00,M11.1.0/02:00" 相同的输出。
  • @JoeC ZoneId.systemDefault() 返回 GMT-05:00
  • @AndyTurner 好像是JVM的bug,你有什么想法可以解决吗?
  • here,如果 Java 不能识别时区,它看起来好像只支持固定偏移的自定义时区。

标签: java time timezone posix dst


【解决方案1】:

我不确定您使用的是哪个 linux 版本,但我已经在 Red Hat 4.4 中进行了测试,它接受 IANA's names:

export TZ=America/New_York
date

输出是:

美国东部时间 2018 年 3 月 14 日 08:37:25

我还查看了网络上的一些文章,所有示例都使用“America/New_York”、“Europe/London”等名称。

但无论如何,如果你的 linux 版本不支持这个,最好将你的代码更改为不使用 JVM 默认时区:

ZonedDateTime.now(ZoneId.of("America/New_York"));

实际上,我认为最好使用特定的时区,因为默认的can be changed at runtime,对于在同一JVM 中运行的任何 应用程序。即使您可以控制应用程序的功能,一些基础设施/环境维护也可能会有意或无意地改变这一点 - 我曾经遇到过这种情况,这让我开始在任何地方都使用明确的时区名称。

并且总是更喜欢 IANA 的名称,格式为 Continent/RegionEST+5EDT 之类的名称是固定的,因为它们仅代表一个偏移量(在本例中为 GMT-05:00),没有任何夏令时规则。只有像America/New_York 这样的名称包含夏令时规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 2014-09-21
    • 1970-01-01
    • 2011-10-31
    • 2019-10-25
    • 2011-12-21
    • 1970-01-01
    • 2018-12-14
    相关资源
    最近更新 更多