我正在尝试设置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的值在设置不同的时区后不会改变.但是,如果我取消注释HOUR_OF_DAY的date.get,那么一切都完全正常
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方法正在改变对象行为?
解决方法
GregorianCalendar
类从Calendar继承其
get
方法,具有以下副作用:
In lenient mode,all calendar fields are normalized.
这意味着在Calendar对象上调用get时,将重新计算时间值和所有字段.这可能导致一些不可预测的行为,特别是当与setTimeZone结合使用时,它自己有一些documented buggy behavior.