根据时区计算时间

  • 本文关键字:时间 计算 时区 java
  • 更新时间 :
  • 英文 :


我的代码正确计算日期和时间,包括从印度的本地服务器运行时,包括日光的时间。但是,当我从美国服务器运行相同的代码时,我会得到时间,而不是吸收DST的TimeZoneID提前一个小时。

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();
}

来自当地人的结果:

Currtime:MONT 22 01:52:21 IST 2012

来自USSERVER的结果:

Currtime:MONT 22 02:52:21 IST 2012

此代码没有多大意义。不必转换日期对象即可在另一个时区使用。它代表了通用的瞬间。

在显示(或格式化为字符串)的日期对象时,使用时区是有意义的。在这种情况下,您应该简单地在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));

最新更新