较旧的日期被解析为夏令时,即使在 Java 中并非如此

Older dates are parsed as summer time, even if that is not true in Java

我在显示多个存储为长整数的日期时遇到问题。 我使用带有 long 参数的构造函数创建日期对象,然后将日期打印到 PDF 文件。

但是,与 Windows.

相比,当 运行 Linux 上的程序时,我对较旧的日期有疑问

以这个日期:1976年4月25日00:00:00(长值:199231200000L)为例。如果我使用 dateformater 来显示日期,它将在 Linux 和 Windows:

上显示不同

在 Windows:1976 年 4 月 25 日 00:00:00 CEST

在 Linux:1976 年 4 月 24 日 23:00:00 CET

文字代表。可以简单地通过 运行 以下行显示:

DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.FULL ).format( new Date( 199231200000L) )

我使用 Joda Time 获取此测试的日期值:

new org.joda.time.DateTime().withDate( 1976, 4, 25 ).withTime( 0, 0, 0, 0 ).toDate().getTime()

为什么 Windows 将输出显示为 CEST,而 Linux 显示为 CET?

France has introduced summer time in 1976, but Denmark 于 1980 年开始使用夏令时。这解释了您观察到的差异,所以除了您的系统时区不同之外,一切都是正确的。您最好在两台机器上使用相同的显式时区,而不是依赖默认时区。

顺便说一句,如果我查看您使用的时间戳,那么我看不到毫秒或只有分钟的部分,这让我想如果意图只是存储一个纯日历日期。如果是这样,那么使用时区通常是危险的,因为您的问题清楚地说明了这一点。现在 Java-8 具有用于此目的的类型 LocalDate - 幸运的是。