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/Region
。 EST+5EDT
之类的名称是固定的,因为它们仅表示一个偏移量(在本例中为 GMT-05:00),没有任何夏令时规则。只有像 America/New_York
这样的名称包含 DST 规则。
我正在以 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/Region
。 EST+5EDT
之类的名称是固定的,因为它们仅表示一个偏移量(在本例中为 GMT-05:00),没有任何夏令时规则。只有像 America/New_York
这样的名称包含 DST 规则。