【问题标题】:How to fix Calendar after using setTimeZone?使用 setTimeZone 后如何修复日历?
【发布时间】:2023-03-10 15:15:02
【问题描述】:

以下代码会产生意想不到的行为: 我期待Calendar 最后返回相同的getTimeInMillis 值(在这种情况下为1469008800000),它们应该是equal。 - 但他们不这样做......

我认为这与http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4827490 有关,但在setTimeZone 之后调用get 并没有改变任何如“WORK AROUND”(“更改时区后,我们必须调用一些读取方法” )...

或者“WORK AROUND”是错误的,必须在使用setTimeZone 之前调用一些get 方法之前

Calendar calendar1 = Calendar.getInstance(TimeZone.getTimeZone("CET"));
Calendar calendar2 = Calendar.getInstance(TimeZone.getTimeZone("CET"));
calendar1.set(2016, 07 - 1, 20, 12, 00, 0);
calendar2.set(2016, 07 - 1, 20, 12, 00, 0);
calendar1.set(Calendar.MILLISECOND, 0);
calendar2.set(Calendar.MILLISECOND, 0);

System.out.println("creation: " + calendar1.equals(calendar2));

System.out.println(calendar1.getTimeInMillis());

System.out.println("get: " + calendar1.equals(calendar2));

calendar1.setTimeZone(TimeZone.getTimeZone("Z"));
calendar2.setTimeZone(TimeZone.getTimeZone("Z"));

System.out.println("setTimeZone: " + calendar1.equals(calendar2));

calendar1.get(Calendar.YEAR);
calendar2.get(Calendar.YEAR);

System.out.println("get: " + calendar1.equals(calendar2));

System.out.println();
System.out.println(calendar1.getTimeInMillis());
System.out.println(calendar2.getTimeInMillis());
System.out.println("end: " + calendar1.equals(calendar2));

输出:

creation: true
1469008800000
get: true
setTimeZone: false
get: false

1469008800000
1469016000000
end: false

【问题讨论】:

    标签: java timestamp


    【解决方案1】:

    我可以指出,在您提供的代码中,您将两个日历设置为完全相同的表达式,但 Calendar.MILISECONDS 将值从一个调用更改为另一个调用,因为两个调用之间的时间过去了。

    如果您将第二个日历设置为第一个日历,而不是将其设置为Calendar.MILISECONDS,您应该没问题。

    编辑:编辑问题后,我的答案不再相关,我保留它的唯一目的是保留其评论部分。

    【讨论】:

    • 您看到这些值之间的区别了吗? 7200000 毫秒,精确到 2 小时。
    • 对不起,没有意识到,此时我的答案不在主题范围内,但可以证明即使没有任何类型的错误,这两个值也不可能相等,只是差异应该很大更小。
    • @André 您在第 6 行之后使用最后一行的 System.out 进行了验证,结果为真?
    • @eldo:是的,2h 是 CET 和 Z 之间的差异 - 但时间戳应该相等......
    • @CMax:我更新了代码:使用 setTimeZone 后,日历不再相等...
    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多