Java 时间忽略夏令时规则

Java time ignores daylight saving rules

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

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

Linux date 命令 returns:

Wed Mar 14 03:47 EDT 2018

Java ZonedDateTime.now() returns:

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

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

我不确定你使用的 linux 版本,但我已经在 Red Hat 4.4 中测试过,它接受 IANA's names:

export TZ=America/New_York
date

输出为:

Qua Mar 14 08:37:25 EDT 2018

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

但是无论如何,如果您的 linux 版本不适用于此,最好将您的代码更改为不使用 JVM 默认时区:

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

实际上,我认为使用特定时区更好,因为默认 can be changed at runtime,对于同一 JVM 中的 any 应用程序 运行。即使您可以控制应用程序的功能,一些 infrastructure/environment 维护也可以改变它,无论是有意还是无意 - 它发生在我身上一次,这让我开始在任何地方使用明确的时区名称。

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