Java时间忽略夏令时规则

Java时间忽略夏令时规则,java,time,timezone,posix,dst,Java,Time,Timezone,Posix,Dst,我正在以POSIX格式导出TZ变量以在Linux上设置时区。例如: export TZ="EST+5EDT,M3.2.0/02:00,M11.1.0/02:00" Linuxdate命令返回: 2018年3月14日星期三03:47美国东部时间 JavaZoneDateTime.now()返回: 2018-03-14T02:47:36.808[GMT-05:00] Java似乎没有考虑DST规则。有什么问题吗?我不确定您使用的是什么linux版本,但我已经在Red Hat 4.4中进行了测试,它

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

export TZ="EST+5EDT,M3.2.0/02:00,M11.1.0/02:00"
Linux
date
命令返回:

2018年3月14日星期三03:47美国东部时间

Java
ZoneDateTime.now()返回:

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


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

我不确定您使用的是什么linux版本,但我已经在Red Hat 4.4中进行了测试,它接受:

输出为:

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

我还查阅了一些网上的文章,所有的例子都使用诸如“美国/纽约”、“欧洲/伦敦”等名称

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

ZonedDateTime.now(ZoneId.of("America/New_York"));
实际上,我认为最好使用一个特定的时区,因为默认情况下,对于运行在同一JVM中的任何应用程序。即使您可以控制应用程序的工作,一些基础设施/环境维护也可以改变这一点,无论是有意的还是无意的——这曾经发生在我身上,这让我开始在任何地方使用明确的时区名称


而且总是喜欢IANA的名字,格式为
大陆/地区
。像
EST+5EDT
这样的名称是固定的,因为它们只代表一个偏移量(在本例中为GMT-05:00),没有任何夏令时规则。只有像
America/New_York
这样的名称才包含DST规则。

ZoneId.systemDefault()返回的是什么?猜测一下,JVM不会尝试解析第一个逗号之后的任何内容。例如,
TZ=“EST+5EDT,我是一个小茶壶”
产生的输出与
TZ=“EST+5EDT,M3.2.0/02:00,M11.1.0/02:00”
@JoeC ZoneId.systemDefault()返回的GMT-05相同:00@AndyTurner这看起来像是JVM bug,你有什么想法吗?看,看起来Java只支持固定偏移量的自定义时区,如果该时区不是它可以识别的时区。
ZonedDateTime.now(ZoneId.of("America/New_York"));