gpt4 book ai didi

java - 为什么 1971 年 11 月 1 日之前的日期要在 java.util.Date 上添加一个小时?

转载 作者:行者123 更新时间:2023-12-01 04:49:08 26 4
gpt4 key购买 nike

以下代码似乎演示了 java.util.Date 中的一个错误,如果本地时钟设置为 GMT 并启用 DST 调整并且时间在 1971 年 11 月 1 日之前,则会添加一个小时。我的第一个假设始终是我搞错了。任何人都可以看到出了什么问题(或者这真的是一个 Java 错误)吗? 1971 年 11 月 1 日有什么重要意义?

import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.TimeZone;

class JavaUtilDateBug
{
private static void demo() throws Exception
{
// UK developers usually have the clock on their development machines set
// to "Europe/London" (i.e. GMT with daylight saving). Set it explicitly
// here so readers in other countries can see the problem too.
TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
Locale.setDefault(Locale.ENGLISH);

SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
String strJan1st1970Expected = "Thu Jan 01 00:00:00 GMT 1970";
String strJan1st1970Actual = dateFormat.parse(strJan1st1970Expected).toString();
System.out.println("strJan1st1970Actual: " + strJan1st1970Actual); // -> "Thu Jan 01 01:00:00 GMT 1970"
boolean jvmHasDateBug = !strJan1st1970Expected.equals(strJan1st1970Actual);
System.out.println("jvmHasDateBug: " + jvmHasDateBug); // -> true

// The anomaly only seems to affect times before 1 Nov 1971.
final String strNov1st1971 = "Mon Nov 01 00:00:00 GMT 1971";
assert strNov1st1971.equals(dateFormat.parse(strNov1st1971).toString());
}

public static void main(String[] args)
{
try
{
demo();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

我的Java环境:

  java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03)
Java HotSpot(TM) Client VM (build 11.3-b02, mixed mode, sharing)

最佳答案

1968 年 10 月 27 日至 1971 年 10 月 31 日期间对英国标准时间进行了一次试验,我怀疑这就是导致此问题的原因。

这里有一些试验细节:

http://en.wikipedia.org/wiki/British_Summer_Time#Single.2FDouble_Summer_Time

1970 年 1 月 1 日欧洲/伦敦的时区是英国标准时间 (GMT+1),因此当您使用 java.text.SimpleDateFormat 解析 Jan 01 00:00:00 GMT 1970 时它生成的正确纪元值等于 BST 中的 Jan 01 01:00:00 1970。

然后,由于 java.util.Date 的糟糕性,当您调用 java.util.Date.toString() 时,它会使用当前的默认时区截至现在,已更改为 GMT,您将得到 Jan 01 01:00:00 GMT 1970。

关于java - 为什么 1971 年 11 月 1 日之前的日期要在 java.util.Date 上添加一个小时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15300517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com