12

DST の「スプリング フォワード」時に23:59:59から1:00:00にスキップするタイム ゾーンが少なくとも 1 つあります。誰がそれが何であるか知っていますか?

以下は通常、今日の日付を取得しますが、上記の基準に一致するタイムゾーンでは年に 1 日失敗します。

$ perl -MDateTime -E'say DateTime->today( time_zone => $ARGV[0] )->ymd;' \
   America/New_York
2013-08-28

テスト目的でタイムゾーンが必要です。上記のコードを機能させようとしているわけではありません。

4

2 に答える 2

10

いくつかあります。2020 年 4 月現在、パラグアイ、キューバ、チリ、グリーンランド/デンマーク、ヨルダン、レバノン、シリア、パレスチナ、イラン、アゾレス諸島/ポルトガルの 10 か国に 14 のタイム ゾーンがあります。

2019 年 4 月より前は、タイム ゾーンを使用してブラジルがリストに含まれていました。America/Sao_Paulo

$ perl -MDateTime -E'say DateTime->new(
     year => 2013, month => 10, day => 20, hour => 12,
     time_zone => "America/Sao_Paulo")->truncate( to => "day" )->ymd;'
Invalid local time for date in time zone: America/Sao_Paulo

日付を取得する前に「フローティング」トメ ゾーンに切り替えることで、この問題を回避できます。

$ perl -MDateTime -E'say DateTime->new(
     year => 2013, month => 10, day => 20, hour => 12,
     time_zone => "America/Sao_Paulo")
   ->set_time_zone("floating")
   ->truncate( to => "day" )
   ->ymd;'
2013-10-20

このドキュメントを参照してください。

于 2013-08-28T13:57:59.800 に答える
4

Java で小さなプログラムをまとめて、2020 年の日付を含み、日付の開始が午前 0 時ではないすべてのゾーンを検索しました。その出力には、私のマシンのすべてのタイムゾーンと、2020 年の時点で要件に一致する Java のバージョン、および午前 0 時以外の開始時刻の日付と時刻が一覧表示されます。

import java.time.*;
import java.time.zone.ZoneRulesProvider;
import java.util.stream.Stream;

public class ListTimeZonesWithoutMidnight {
    public static void main(String[] args) {
        System.out.printf("Java vendor & version: %s %s\n", System.getProperty("java.vendor"), Runtime.version());
        System.out.printf("Zone rules versions: %s\n", ZoneRulesProvider.getVersions("UTC").keySet());
        System.out.println();

        ZoneId.getAvailableZoneIds().stream().sorted().map(ZoneId::of)
                .flatMap(zoneId -> getNonMidnightStartOfDays(Year.of(2020), zoneId))
                .forEachOrdered(System.out::println);
    }

    private static Stream<LocalDate> getAllDates(Year year) {
        return year.atDay(1).datesUntil(year.plusYears(1).atDay(1));
    }

    private static Stream<ZonedDateTime> getNonMidnightStartOfDays(Year year, ZoneId zoneId) {
        return getAllDates(year).map(d -> d.atStartOfDay(zoneId))
                .filter(d -> !d.toLocalTime().equals(LocalTime.MIDNIGHT));
    }
}

出力:

Java vendor & version: AdoptOpenJDK 14.0.1+7
Zone rules versions: [2019c]

2020-10-04T01:00-03:00[America/Asuncion]
2020-03-08T01:00-04:00[America/Havana]
2020-09-06T01:00-03:00[America/Santiago]
2020-03-29T01:00Z[America/Scoresbysund]
2020-03-27T01:00+03:00[Asia/Amman]
2020-03-29T01:00+03:00[Asia/Beirut]
2020-03-27T01:00+03:00[Asia/Damascus]
2020-03-27T01:00+03:00[Asia/Gaza]
2020-03-27T01:00+03:00[Asia/Hebron]
2020-03-21T01:00+04:30[Asia/Tehran]
2020-03-29T01:00Z[Atlantic/Azores]
2020-09-06T01:00-03:00[Chile/Continental]
2020-03-08T01:00-04:00[Cuba]
2020-03-21T01:00+04:30[Iran]

これらの 14 のゾーン名は、パラグアイ、キューバ、チリ、グリーンランド/デンマーク、ヨルダン、レバノン、シリア、パレスチナ、イラン、アゾレス諸島/ポルトガルの 10 か国にあります。

于 2020-04-20T17:25:41.443 に答える