Java 使用setTimeZone后如何修复日历?

Java 使用setTimeZone后如何修复日历?,java,timestamp,Java,Timestamp,以下代码生成未执行的行为: 我希望这两个日历在末尾返回相同的getTimeInMillis(1469008800000)值,并且它们应相等-但他们不这样做 我认为这与此有关,但是在setTimeZone之后调用get不会改变任何内容,就像“变通”一样(“改变时区后,我们必须调用一些读取方法”) 还是“变通”错误,在使用setTimeZone之前必须调用一些get方法 Calendar calendar1 = Calendar.getInstance(TimeZone.getTimeZone("C

以下代码生成未执行的行为: 我希望这两个
日历
在末尾返回相同的
getTimeInMillis
1469008800000
)值,并且它们应
相等
-但他们不这样做

我认为这与此有关,但是在
setTimeZone
之后调用
get
不会改变任何内容,就像“变通”一样(“改变时区后,我们必须调用一些读取方法”)

还是“变通”错误,在使用
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

请允许我指出,在您提供的代码中,您将两个日历设置为完全相同的表达式,但
Calendar.milisconses
将值从一个调用更改为另一个调用,两个调用之间的时间间隔

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


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

请允许我指出,在您提供的代码中,您将两个日历设置为完全相同的表达式,但是,
Calendar.miliskes
将值从一个调用更改为另一个调用,因为两个调用之间的时间间隔

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


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

您看到这些值之间的差异了吗?7200000ms如此精确2小时。对不起,我没有意识到,此时我的答案不在主题中,但它将坚持,即使没有任何类型的错误,这两个值也不可能相等,只是差异应该小得多。@André你在第6行之后用系统验证了它。从最后一行出来,结果是真的?@eldo:是的,2h是CET和Z之间的差异-但时间戳应该相等…@CMax:I更新了代码:使用setTimeZone后,日历不再相等…您看到这些值之间的差异了吗?7200000ms如此精确2小时。对不起,我没有意识到,此时我的答案不在主题中,但它将坚持,即使没有任何类型的错误,这两个值也不可能相等,只是差异应该小得多。@André你在第6行之后用系统验证了它。从最后一行出来,结果是真的?@eldo:是的,2h是CET和Z之间的差异-但时间戳应该相等…@CMax:I更新了代码:使用setTimeZone后,日历不再相等。。。