Java日历的设置值不会提供预期的日期时间

前端之家收集整理的这篇文章主要介绍了Java日历的设置值不会提供预期的日期时间前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个小时,分钟,日期和毫秒时间戳,并且正在尝试创建一个表示时间的Date对象.时间戳在Eastern Daylight Time中提供.

在解剖这个问题时,我创建了一些简单的测试代码来看看发生了什么,并且已经观察到以下内容

  1. Date today = new Date();
  2. int hour = 4,min = 0,sec = 0,ms = 64;
  3. boolean print = true;
  4.  
  5. Calendar cal = GregorianCalendar.getInstance();
  6. if(print)
  7. System.out.println("After initializing,time is: "+cal.getTime());
  8. cal.clear();
  9. if(print)
  10. System.out.println("After clearing,time is: "+cal.getTime());
  11. cal.setTime(today);
  12. if(print)
  13. System.out.println("After setting date,time is: "+cal.getTime());
  14. cal.set(Calendar.HOUR_OF_DAY,hour);
  15. if(print)
  16. System.out.println("After setting hour,time is: "+cal.getTime());
  17. cal.set(Calendar.MINUTE,min);
  18. if(print)
  19. System.out.println("After setting minute,time is: "+cal.getTime());
  20. cal.set(Calendar.SECOND,sec);
  21. if(print)
  22. System.out.println("After setting second,time is: "+cal.getTime());
  23. cal.set(Calendar.MILLISECOND,ms);
  24. if(print)
  25. System.out.println("After setting milliseconds,time is: "+cal.getTime());
  26. cal.setTimeZone(TimeZone.getTimeZone("EDT"));
  27.  
  28. System.out.println("After setting time zone,time is: "+cal.getTime());

这产生的输出

  1. After initializing,time is: Tue Jan 07 16:01:59 EST 2014
  2. After clearing,time is: Thu Jan 01 00:00:00 EST 1970
  3. After setting date,time is: Tue Jan 07 16:01:59 EST 2014
  4. After setting hour,time is: Tue Jan 07 04:01:59 EST 2014
  5. After setting minute,time is: Tue Jan 07 04:00:59 EST 2014
  6. After setting second,time is: Tue Jan 07 04:00:00 EST 2014
  7. After setting milliseconds,time is: Tue Jan 07 04:00:00 EST 2014
  8. After setting time zone,time is: Tue Jan 07 04:00:00 EST 2014

但是,如果我稍微更改代码

  1. boolean print = false;

我得到以下(不同)结果(!)

  1. After setting time zone,time is: Mon Jan 06 23:00:00 EST 2014

有人知道为什么会发生这种情况吗?

解决方法

您需要先设置时区.请参阅下面的GregorianCalendar.setTimeZone的定义:
  1. public void setTimeZone(TimeZone value)
  2. {
  3. zone = value;
  4. sharedZone = false;
  5. /* Recompute the fields from the time using the new zone. This also
  6. * works if isTimeSet is false (after a call to set()). In that case
  7. * the time will be computed from the fields using the new zone,then
  8. * the fields will get recomputed from that. Consider the sequence of
  9. * calls: cal.setTimeZone(EST); cal.set(HOUR,1); cal.setTimeZone(PST).
  10. * Is cal set to 1 o'clock EST or 1 o'clock PST? Answer: PST. More
  11. * generally,a call to setTimeZone() affects calls to set() BEFORE AND
  12. * AFTER it up to the next call to complete().
  13. */
  14. areAllFieldsSet = areFieldsSet = false;
  15. }

猜你在找的Java相关文章