Java时间忽略夏令时规则

时间:2018-03-14 08:05:47

标签: java time timezone posix dst

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

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

Linux date命令返回:

  

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

Java ZonedDateTime.now()返回:

  

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

似乎Java没有考虑DST规则。什么可能是错的?

2 个答案:

答案 0 :(得分:1)

我不确定您使用的是哪个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中运行的任何应用程序。即使您可以控制应用程序的功能,一些基础架构/环境维护也可能会有意或无意地改变它 - 它曾经发生在我身上,这让我开始在任何地方使用明确的时区名称。

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

答案 1 :(得分:-2)

“看起来像JVM bug”,你在评论中说道。

为什么有些开发人员只是因为它没有做他们认为应该做的事情而认为“是一个bug”?

文档没有说它确实(实际上,根本没有提到posix),所以为什么你会这样做呢?

大喊“BUG!”只是因为你没有阅读文档而且事情没有按你认为的那样工作,这是开发人员最讨厌的行为之一。

在互联网上抱怨之前,先学习阅读javadoc:

https://docs.oracle.com/javase/7/docs/api/java/util/TimeZone.html

https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html