Java GregorianCalendar更改TimeZone [英] Java GregorianCalendar change TimeZone
问题描述
我正在尝试设置HOUR_OF_DAY字段并更改GregorianCalendar日期对象的时区.
I'm trying to set HOUR_OF_DAY field and change Timezone of the GregorianCalendar date object.
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的值不会更改.但是,如果我取消对HOUR_OF_DAY的date.get的注释,一切都会按预期进行
For some reason value of HOUR_OF_DAY does not change after setting different timezone. But if I uncomment date.get for HOUR_OF_DAY, everything works exactly as it should
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方法会更改对象行为?
How is this possible? Why .get method is changing object behaviour?
推荐答案
GregorianCalendar
类继承其
The GregorianCalendar
class inherits its get
method from Calendar
, which has the following side effect:
在宽大模式下,所有日历字段均已标准化.
In lenient mode, all calendar fields are normalized.
这意味着在 Calendar
对象上调用 get
时,将重新计算 time
值和所有字段.这可能导致某些不可预测的行为,特别是与 setTimeZone
结合使用时,该行为具有某些已记录的越野车行为.
This means that the time
value and all fields are recomputed when get
is called on a Calendar
object. This can lead to some unpredictable behavior, particularly when coupled with setTimeZone
, which has some documented buggy behavior of its own.
这篇关于Java GregorianCalendar更改TimeZone的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!