3

私のコードは、インドのローカルサーバーで実行すると、dayLightSaving 時間を含めて日付と時刻を正しく計算します。しかし、米国のサーバーから同じコードを実行すると、DST を遵守していない timeZoneId に対して 1 時間先の時刻が取得されます。

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

4

1 に答える 1

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));
于 2012-10-22T09:25:18.247 に答える