gpt4 book ai didi

java - 公历年份设置不正确

转载 作者:行者123 更新时间:2023-12-01 11:36:58 26 4
gpt4 key购买 nike

我对 Java 相当陌生,我正在尝试找出 GregorianCalendar 的奇怪之处。年份似乎设置不正确(有时)。

我做了以下测试函数,来说明问题:

public static void testTime(Calendar c) {
SimpleDateFormat sdf =
new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+0"));

System.out.println("---------------------------------");
c.setTimeInMillis(0);
Date d = c.getTime();
System.out.println("Time 0: " + sdf.format(d) +
" (" + d.getTime() + ")");

c.set(Calendar.YEAR, 2000);
d = c.getTime();
System.out.println("Year 2000: " + sdf.format(d) +
" (" + d.getTime() + ")");
System.out.println("---------------------------------");
}

此函数采用 Calendar 对象,并生成如下所示的输出:

---------------------------------
Time 0: 1970/01/01 00:00:00 (0)
Year 2000: 2000/01/01 00:00:00 (946684800000)
---------------------------------

我从 main 调用该函数 3 次;调用它的代码如下所示:

   Calendar c = GregorianCalendar.getInstance();
testTime(c);

c.setTimeZone(TimeZone.getTimeZone("GMT+0"));
testTime(c);

c.setTimeZone(TimeZone.getTimeZone("America/Phoenix"));
testTime(c);

最后,这是输出:

---------------------------------
Time 0: 1970/01/01 00:00:00 (0)
Year 2000: 2001/01/01 00:00:00 (978307200000)
---------------------------------
---------------------------------
Time 0: 1970/01/01 00:00:00 (0)
Year 2000: 2000/01/01 00:00:00 (946684800000)
---------------------------------
---------------------------------
Time 0: 1970/01/01 00:00:00 (0)
Year 2000: 2001/01/01 00:00:00 (978307200000)
---------------------------------

如您所见,当我使用从 getInstance() 获取的 GregorianCalendar 或将时区设置为的 GregorianCalendar 调用该函数时“America/Phoenix”(我的本地时区),年份输出为 2001。当我将时区设置为 GMT 时,年份(我认为正确)输出为 2000

有人可以向我解释一下我缺少什么吗?我想通过创建一个日历,使用我拥有的一些变量设置一些字段,然后生成一个日期来使用日历。但是,我需要确保我返回的日期确实准确反射(reflect)了我所设置的内容;我对我的单元测试有点疯狂,直到我意识到我得到的日期与我输入的年份根本不匹配,所以我编写了上面的代码来测试。

编辑:需要明确的是,我不关心时区造成的小偏移。我能理解并解释。由于时区的原因,+-24 小时的时差是一回事;一年的时差(2001 年而不是 2000 年)是另一回事。

如果重要的话,这个 Java 运行在 64 位 Linux 机器上; java -showversion 命令返回:

java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)

预先感谢您的帮助。我已经尽可能多地搜索了这里的论坛和互联网,但找不到任何接近我的问题的内容。

最佳答案

好吧,我知道发生了什么事。

当我设置年份时,它确实将年份设置为 2000 年。然后它似乎使用它拥有的时区更新了其内部字段的其余部分。

这意味着当我将年份设置为 2000 年时,它会设置该字段并计算时间(包括时区)。上一个时间是 1970 年 1 月 1 日 00:00:00。它将年份更新为 2000 年,将时间向后移动 7 小时(我的偏移量),得到 12 月 31 日 17:00 MST 的时间。年份实际上应该回滚到 1999 年,但它会将年份保留在 2000 年,因为这就是我设置的。因此,结果日期为 2000 年 12 月 31 日 17:00。

当我打印日期时,我将 SimpleDateFormat 的时区设置为 GMT。因此,它将时间向前移动 7 小时,至 2001 年 1 月 1 日 00:00:00。

这确实令人困惑,但反复的测试表明它确实是这样做的。奇怪,但却是事实。这里的教训(对我来说)是我应该设置输出对象的时区以匹配日历的时区。然后它将显示与我输入的内容相匹配的日期。

关于java - 公历年份设置不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29871771/

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