有关java.util.Calendar的问题

4

我正在尝试理解以下代码的行为。 我的本地时区是UTC-7(亚利桑那州)。

Calendar cal = Calendar.getInstance();
cal.set(Calendar.MINUTE,40);
cal.set(Calendar.AM_PM,Calendar.PM);
System.out.println("1 UTC -4 Hour:" + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("1 UTC -4 Day:" + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("1 UTC -7 Time Stamp:" + cal.getTime().toString());
cal.set(Calendar.HOUR,12);
System.out.println("2 UTC -4 Hour:" + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("2 UTC -4 Day:" + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("2 UTC -7 Time Stamp:" + cal.getTime().toString());
cal.setTimeZone(TimeZone.getTimeZone("America/New_York")); //set time zone to UTC -4
System.out.println("3 UTC -4 Hour:" + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("3 UTC -4 Day:" + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("3 UTC -7 Time Stamp:" + cal.getTime().toString());
cal.set(Calendar.HOUR,12);
System.out.println("4 UTC -4 Hour:" + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("4 UTC -4 Day:" + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("4 UTC -7 Time Stamp:" + cal.getTime().toString());

它生成以下输出:
1 UTC -4 Hour:12 1 UTC -4 Day:27 1 UTC -7 Time Stamp:Tue Sep 27 12:40:37 MST 2011 2 UTC -4 Hour:0 2 UTC -4 Day:28 2 UTC -7 Time Stamp:Wed Sep 28 00:40:37 MST 2011 3 UTC -4 Hour:3 3 UTC -4 Day:28 3 UTC -7 Time Stamp:Wed Sep 28 00:40:37 MST 2011 4 UTC -4 Hour:12 4 UTC -4 Day:28 4 UTC -7 Time Stamp:Wed Sep 28 09:40:37 MST 2011
我不理解的是为什么第一个cal.set(Calendar.HOUR,12)会导致日期翻转到下一天。使用add()调整一个值会导致其他值被调整是有道理的,但是set()也做到这一点就没有道理了。
是否有一种绝对的set()方法可以保留所有其他值?
1个回答

6
你设置的是“HOUR”而不是“HOUR_OF_DAY”。因此,它将被设置为“下午开始12小时后”的时间 - 即那一天的午夜结束,所以是下一天的开始。可以将其视为说:“我应该是下午,所以设置小时是中午+小时*12”。
个人认为这仍然是有点奇怪的行为,但我建议使用“HOUR_OF_DAY”...或者最好一开始就使用Joda Time

是的,我不喜欢那种行为。set(Calendar.HOUR, 12) 不应该根据 AM_PM 的设置而表现不同。我会在我的现有项目中处理这种行为,但将来我会研究 Joda Time。 - opike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接