关于java.util.Calendar的问题

时间:2011-09-27 19:21:36

标签: java date calendar 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());

它会生成此输出:

  

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时间戳:9月28日星期三00:40:37 MST 2011
  3 UTC -4小时:3
  3 UTC -4天:28
  3 UTC -7时间戳:9月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(),其中保留所有其他值?

1 个答案:

答案 0 :(得分:6)

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

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