【发布时间】:2014-01-25 17:53:39
【问题描述】:
我有一个小时、分钟、日期和毫秒时间戳,并且正在尝试创建一个表示时间的 Date 对象。时间戳以东部夏令时间提供。
在剖析问题时,我创建了一些简单的测试代码来查看发生了什么,并观察到以下情况:
Date today = new Date();
int hour = 4, min = 0, sec = 0, ms = 64;
boolean print = true;
Calendar cal = GregorianCalendar.getInstance();
if(print)
System.out.println("After initializing, time is: "+cal.getTime());
cal.clear();
if(print)
System.out.println("After clearing, time is: "+cal.getTime());
cal.setTime(today);
if(print)
System.out.println("After setting date, time is: "+cal.getTime());
cal.set(Calendar.HOUR_OF_DAY,hour);
if(print)
System.out.println("After setting hour, time is: "+cal.getTime());
cal.set(Calendar.MINUTE,min);
if(print)
System.out.println("After setting minute, time is: "+cal.getTime());
cal.set(Calendar.SECOND,sec);
if(print)
System.out.println("After setting second, time is: "+cal.getTime());
cal.set(Calendar.MILLISECOND,ms);
if(print)
System.out.println("After setting milliseconds, time is: "+cal.getTime());
cal.setTimeZone(TimeZone.getTimeZone("EDT"));
System.out.println("After setting time zone, time is: "+cal.getTime());
这会产生输出:
After initializing, time is: Tue Jan 07 16:01:59 EST 2014
After clearing, time is: Thu Jan 01 00:00:00 EST 1970
After setting date, time is: Tue Jan 07 16:01:59 EST 2014
After setting hour, time is: Tue Jan 07 04:01:59 EST 2014
After setting minute, time is: Tue Jan 07 04:00:59 EST 2014
After setting second, time is: Tue Jan 07 04:00:00 EST 2014
After setting milliseconds, time is: Tue Jan 07 04:00:00 EST 2014
After setting time zone, time is: Tue Jan 07 04:00:00 EST 2014
但是,如果我稍微更改一下代码:
boolean print = false;
我得到以下(不同的)结果(!)
After setting time zone, time is: Mon Jan 06 23:00:00 EST 2014
有人知道为什么会这样吗?
【问题讨论】:
-
我相信格林威治标准时间凌晨 4 点等于美国东部标准时间晚上 11 点。
-
我怀疑这是由于内部字段等待重新计算,这是由打印触发的。但是,这只是 另一个 避免使用 java.util.Calendar 的原因。