4

私はこの問題を調べてきましたが、明確で明確なドキュメントを見つけることができませんでした。

UTC時間とTimeZoneIDがあるとすると、夏時間が1年の間に変化することを知って、Javaで壁時間(= UTC時間+タイムゾーンオフセット+夏時間)を計算するにはどうすればよいですか?

テスト済みのコード例を探しています。ありがとう。

4

2 に答える 2

3

JavaでDateを使用する場合、内部では常にUTCになります。また、タイムゾーンにはDST設定が含まれているため、実際には非常に簡単です。

public static void main(String[] args) throws ParseException {
    String stringAugust = "2011-08-01 12:00:00";
    String stringNovember = "2011-11-01 12:00:00";

    // Outputting the time in Stockholm and Santiago
    // Stockholm has DST in August and not in November
    // Santiago has DST in November and not in August

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    // Parsing the Strings
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    Date dateAugust = sdf.parse(stringAugust);
    Date dateNovember = sdf.parse(stringNovember);

    // outputting the dates for Stockholm
    sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
    sdf.setTimeZone(TimeZone.getTimeZone("Europe/Stockholm"));
    System.out.println(sdf.format(dateAugust));
    System.out.println(sdf.format(dateNovember));

    // outputting the dates for Santiago
    sdf.setTimeZone(TimeZone.getTimeZone("America/Santiago"));
    System.out.println(sdf.format(dateAugust));
    System.out.println(sdf.format(dateNovember));

}

出力

2011-08-01 14:00:00 +0200
2011-11-01 13:00:00 +0100
2011-08-01 08:00:00 -0400
2011-11-01 09:00:00 -0300
于 2011-11-27T14:47:06.723 に答える
3

UTCに時間があると言うとき、私はあなたがそれを保持していると仮定しますCalendarDate誤解を招くにもかかわらず、タイムゾーンの概念はありませんtoString())。時間がある場合、たとえば、次のStringように簡単に解析したり、カレンダーインスタンスを解析したりできます。

Calendar summer = new GregorianCalendar(DateUtils.UTC_TIME_ZONE);
summer.set(2011, Calendar.JUNE, 27, 9, 0, 0);

summer2011年6月27日の午前9:00UTCを表します。これで、タイムゾーンをUTCからオーストラリアのメルボルンに変更するだけです。

summer.setTimeZone(TimeZone.getTimeZone("Australia/Melbourne"));

FastDateFormat日付を正しく印刷するために使用します。

final FastDateFormat formatter = FastDateFormat.getDateTimeInstance(FastDateFormat.SHORT, FastDateFormat.SHORT);

System.out.println(formatter.format(summer));

メルボルンの時間は19:00(+10時間)です。ただし、日付を冬に変更します。

Calendar winter = new GregorianCalendar(DateUtils.UTC_TIME_ZONE);
winter.set(2011, Calendar.DECEMBER, 27, 9, 0, 0);
System.out.println(formatter.format(winter));

そして突然、メルボルンの時間は20:00(+11時間)になります。

Calendar違いは、のタイムゾーンを変更するとDSTが考慮されることを証明しています。UTCタイムゾーンの6月の間、オーストラリアでは冬があります。したがって、彼らはDSTを監視しません。

しかし、UTCの冬の間、オーストラリアには夏があります-そして、彼らは時計を1時間シフトすることによってDSTに切り替えます。これが、冬のUTCの夏の+10に対して、冬の差が+11時間である理由です。


ちょっと待って!DSTを監視する複数のタイムゾーンを考慮すると、さらに興味深いものになります。まず、ヨーロッパ/オスロのタイムゾーンで同じ日付を作成します。

Calendar winter = new GregorianCalendar(TimeZone.getTimeZone("Europe/Oslo"));
winter.set(2011, Calendar.DECEMBER, 27, 9, 0, 0);

冬のオスロの9:00はUTC8:00ですが、メルボルンの19:00(+10時間)です。

しかし、夏の同じ時間:

Calendar summer = new GregorianCalendar(TimeZone.getTimeZone("Europe/Oslo"));
summer.set(2011, Calendar.JUNE, 27, 9, 0, 0);

実はメルボルンでは7:00UTCと17:00です!+8時間

どういうわけか、人々は2つのタイムゾーンの違いが常に一定であると想定しています(「オスロとメルボルンの違いは常に10時間です)。これは、特に異なる半球を考慮した場合には当てはまりません。

実際には、オスロの冬の間(DSTなし、UTC + 1)、メルボルン(UTC + 11)でDSTが観測されます。一方、オスロでは夏時間があり、DSTが観測されている(UTC + 2)が、メルボルンでは観測されていない(UTC + 10)。これで、1年の日によって違いが8時間から10時間の間で変化する理由が明らかになります。

また、DSTの最初と最後の日はグローバルではなく、タイムゾーンごとに任意に選択されることを忘れないでください。これは、9時間の差も可能であることを意味します(!)たとえば、今年の4月1日をチェックしてください。

于 2011-11-27T14:48:50.433 に答える