7

我正在尝试设置 HOUR_OF_DAY 字段并更改 GregorianCalendar 日期对象的时区。

GregorianCalendar date = new GregorianCalendar(TimeZone.getTimeZone("GMT+10"));
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY));
date.set(Calendar.HOUR_OF_DAY, 23);
//date.get(Calendar.HOUR_OF_DAY);
date.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY));

输出:

HOUR: 16
HOUR: 23

由于某些原因,设置不同时区后 HOUR_OF_DAY 的值不会改变。但是,如果我取消注释 date.get 的 HOUR_OF_DAY,一切正常

GregorianCalendar date = new GregorianCalendar(TimeZone.getTimeZone("GMT+10"));
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY));
date.set(Calendar.HOUR_OF_DAY, 23);
date.get(Calendar.HOUR_OF_DAY); // uncommenting this line will is changing the output
date.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY));

输出:

HOUR: 16
HOUR: 13

这怎么可能?为什么 .get 方法正在改变对象的行为?

4

2 回答 2

10

该类GregorianCalendar从 继承其get方法Calendar,具有以下副作用:

在宽松模式下,所有日历字段都被规范化。

这意味着在对象上调用time时会重新计算值和所有字段。这可能会导致一些不可预知的行为,尤其是与 结合使用时,它本身就有一些记录在案的错误行为getCalendarsetTimeZone

于 2012-09-27T23:54:04.990 回答
2
于 2018-02-15T06:51:46.610 回答