设置Java Calendar的值不会给出预期的日期时间 [英] Setting values of Java Calendar does not give expected date-time
问题描述
我有一个小时,分钟,日期和毫秒时间戳,我正在尝试创建一个表示时间的Date对象。时间戳在东部夏令时提供。
I have an hour, minute, date and millisecond timestamp, and am trying to create a Date object representing the time. The timestamp is provided in Eastern Daylight Time.
在解剖问题时,我创建了一些简单的测试代码,以查看发生的情况并观察了以下情况:
In dissecting the problem, I created some simple test code to see what was happening and have observed the following:
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
但是,如果我稍微更改代码:
However, if I change the code slightly:
boolean print = false;
我得到以下(不同)结果(!)
I get the following (different) result (!)
After setting time zone, time is: Mon Jan 06 23:00:00 EST 2014
有谁知道为什么会这样?
Does anyone know why this is happening?
推荐答案
你需要设定时间区域第一。请参阅下面GregorianCalendar.setTimeZone的定义:
You need to set the time zone first. See the definition of GregorianCalendar.setTimeZone below:
public void setTimeZone(TimeZone value)
{
zone = value;
sharedZone = false;
/* Recompute the fields from the time using the new zone. This also
* works if isTimeSet is false (after a call to set()). In that case
* the time will be computed from the fields using the new zone, then
* the fields will get recomputed from that. Consider the sequence of
* calls: cal.setTimeZone(EST); cal.set(HOUR, 1); cal.setTimeZone(PST).
* Is cal set to 1 o'clock EST or 1 o'clock PST? Answer: PST. More
* generally, a call to setTimeZone() affects calls to set() BEFORE AND
* AFTER it up to the next call to complete().
*/
areAllFieldsSet = areFieldsSet = false;
}
这篇关于设置Java Calendar的值不会给出预期的日期时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!