关于java.util.Calendar的问题

opi*_*ike 4 java calendar date java.util.date java.util.calendar

我试图通过以下代码了解行为.我当地的时区是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());
Run Code Online (Sandbox Code Playgroud)

它生成此输出:

1 UTC -4小时:12
1 UTC -4天:27
1 UTC -7时间戳:Tue Sep 27 12:40:37 MST 2011
2 UTC -4小时:0
2 UTC -4天:28
2 UTC -7时间邮票:Wed Sep 28 00:40:37 MST 2011
3 UTC -4小时:3
3 UTC -4天:28
3 UTC -7时间戳:Wed Sep 28 00:40:37 MST 2011
4 UTC -4小时:12
4 UTC -4天:28
4 UTC -7时间戳:2011年9月28日星期三09:40:37 MST 2011

我不明白的是为什么第一个cal.set(Calendar.HOUR,12)导致日期翻到第二天.有意义的是,在一个值上使用add()会导致其他值被调整,但set()也没有意义.

有没有办法做一个绝对的set(),其中保留所有其他值?

Jon*_*eet 6

你正在设置"HOUR"而不是"HOUR_OF_DAY".因此,它设定为"下午开始后12小时" - 即当天结束时的午夜,所以下一个开始.想想它说,"我打算成为PM,所以设定小时是midday + hours * 12"

我个人认为这仍然有点奇怪的行为,但我坚持使用HOUR_OF_DAY而不是......或者最好使用Joda Time.