Java8での、サマータイムのサポートを確認

JavaSE8のDate&Time APIを使って、以下のタイムゾーンでの日時を表示して、サマータイムが考慮されているかを確認。

UTC Los Angeles 日本

日本は、サマータイムがないので、LosAngelesでの日時を表示。
APIが沢山あっていろいろな方法があると思うのですが、とりあえず以下の実装で表示。
サマータイムの情報は、Daylight saving time dates for U.S.A. – California – Los Angeles between 2015 and 2019で確認しました。

  • code1

1.UTC日時を取得するのに、以下の方法を使用(同じように各ゾーンの日時を取得)
・ZoneId#ofメソッドで「UTC」を指定
・ZonedDateTime#ofメソッドの第2引数に上記で作成したZoneIdクラスを指定
2.1時間毎の時間は、LocalDateTime#plusHoursメソッドで取得
3.日時の表示は、DateTimeFormatter#formatメソッド

    private void printZonedDateTime(LocalDateTime baseDatetime) {
        ZoneId utcZone = ZoneId.of("UTC");
        ZoneId losZone = ZoneId.of("America/Los_Angeles");
        ZoneId tokyoZone = ZoneId.of("Asia/Tokyo");
        System.out.println(String.format("*** Base Date Time(UTC) is %s ***", DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(baseDatetime), utcZone));
        IntStream.range(0, 24).forEach(i -> {
            LocalDateTime plusHours = baseDatetime.plusHours(i);
            ZonedDateTime utcDatetime = ZonedDateTime.of(plusHours, utcZone);
            ZonedDateTime losDatetime = ZonedDateTime.of(plusHours, losZone);
            ZonedDateTime tokyoDatetime = ZonedDateTime.of(plusHours, tokyoZone);
            String utc = DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(utcDatetime);
            String los = DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(losDatetime);
            String tokyo = DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(tokyoDatetime);
            System.out.println(String.format("UTC:%s, LosAngels:%s, Tokyo:%s", utc, los, tokyo));
        });
    }
  • code2

サマータイムの開始日「2014.3.9」と終了日「2014.11.2」で実行

        System.out.println(String.format("Testing time is %s", ZonedDateTime.now()));
        DaylightSavingSample instance = new DaylightSavingSample();
        // Daylight Saving Time Start
        System.out.println("----- Daylight Saving Time Start -----");
        instance.printZonedDateTime(LocalDateTime.of(2014, Month.MARCH, 9, 0, 0));
        // Daylight Saving Time End
        System.out.println("----- Daylight Saving Time End   -----");
        instance.printZonedDateTime(LocalDateTime.of(2014, Month.NOVEMBER, 2, 0, 0));
  • 実行結果(2014.3.9)

ここでは、2時が3時に1時間すすむので、3時が2回表示されているのでサポートされていることを確認

  • 実行結果(2014.11.2)

2時が1時に戻るはずが、、、(まだサポートされていない?)

全コードはPrinting Daylight Saving Time by Java8 · GitHubにアップしました。
まだまだ勉強しないと、、、