以下代码会产生未预料到的行为:
我希望Calendar
两个getTimeInMillis
在结尾处返回相同的值(在这种情况下为1469008800000
),它们应为equal
。 - 但他们不这样做......
我认为这与http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4827490有一些关系,但在get
之后调用setTimeZone
并没有改变任何内容,因为发布为“周围工作”(“更改时区后,我们必须调用一些读取方法“)......
或者“周围的工作”是错误的,必须使用get
在之前调用一些setTimeZone
方法?
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
答案 0 :(得分:0)
我可以指出,在您提供的代码中,您将两个日历设置为完全相同的表达式,但是Calendar.MILISECONDS
从一次调用更改值到另一个scince时间在两次调用之间传递。
如果您将第二个日历设置为第一个日历,而不是将其设置为Calendar.MILISECONDS
,则应该没问题。