我的代码正确地计算了日期和时间,包括dayLightSaving时间,当时我在印度的本地服务器上运行。但是当我从美国服务器运行相同的代码时,我得到的时间是提前一小时的timeZoneId,而不是DST。
TimeZone tz = TimeZone.getTimeZone("America/Phoenix");
Date currTime = getDateByTZ(new Date(), tz);
System.out.println("currTime" + currTime);
public static Date getDateByTZ(Date d, TimeZone tz) throws Exception {
if (tz == null) {
tz = TimeZone.getDefault();
}
Integer tzOffSet = tz.getRawOffset();
Integer tzDST = tz.getDSTSavings();
Integer defOffSet = TimeZone.getDefault().getRawOffset();
Integer defDST = TimeZone.getDefault().getDSTSavings();
Calendar cal = Calendar.getInstance(tz);
cal.setTime(d);
if (tz.inDaylightTime(d)) {
cal.add(Calendar.MILLISECOND, -defOffSet);
cal.add(Calendar.MILLISECOND, -defDST);
cal.add(Calendar.MILLISECOND, +tzOffSet);
cal.add(Calendar.MILLISECOND, +tzDST);
} else {
cal.add(Calendar.MILLISECOND, -defOffSet);
cal.add(Calendar.MILLISECOND, tzOffSet);
}
return cal.getTime();
}
Localserver的结果:
currTime:Mon Oct 22 01:52:21 IST 2012
USserver的结果:
currTime:Mon Oct 22 02:52:21 IST 2012
答案 0 :(得分:3)
这段代码没有多大意义。不必转换Date对象以在另一个时区中使用。它代表了一个普遍的瞬间。
有意义的是在显示(或格式化为字符串)Date对象时使用时区。在这种情况下,您应该只在DateFormat实例上设置时区,并且将格式化构成日期的通用时刻,以便对给定时区有意义。
Date now = new Date(); // now, whatever the timezone is
DateFormat df = DateFormat.getDateTimeInstance();
df.setTimeZone(TimeZone.getDefault());
System.out.println("Now displayed in the default time zone : " + df.format(now));
df.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println("Now displayed in the New York time zone : " + df.format(now));