我正在以 POSIX 格式导出TZ
变量以在 Linux 上设置时区。例如:
export TZ="EST+5EDT,M3.2.0/02:00,M11.1.0/02:00"
Linuxdate
命令返回:
周三 3月 14 03:47 EDT 2018
JavaZonedDateTime.now()
返回:
2018-03-14T02:47:36.808[GMT-05:00]
Java似乎没有考虑DST规则。可能出了什么问题?
我不确定你使用的是哪个 linux 版本,但我已经在 Red Hat 4.4 中测试过,它接受 IANA 的名称:
export TZ=America/New_York
date
输出为:
Qua Mar 14 08:37:25 EDT 2018
我还检查了网络上的一些文章,所有示例都使用"美国/New_York"、"欧洲/伦敦"等名称。
但无论如何,如果你的 linux 版本不能使用它,最好将你的代码更改为不使用 JVM 默认时区:
ZonedDateTime.now(ZoneId.of("America/New_York"));
实际上,我认为最好使用特定的时区,因为对于在同一 JVM 中运行的任何应用程序,可以在运行时更改默认值。即使您可以控制应用程序的功能,一些基础架构/环境维护也可以有意或无意地改变这一点 - 它曾经发生在我身上,这使我开始在任何地方使用明确的时区名称。
并且总是更喜欢 IANA 的名称,格式为Continent/Region
.像EST+5EDT
这样的名称是固定的,从某种意义上说,它们只表示一个偏移量(在本例中为 GMT-05:00),没有任何夏令时规则。只有像America/New_York
这样的名称包含 DST 规则。