12

在夏令时“向前跳”时,至少有一个时区从23:59:59跳过到1:00:00 。有谁知道它是什么?

以下通常获取今天的日期,但对于符合上述条件的时区,它一年中的一天失败。

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

我需要时区来进行测试。我不是想让上面的代码工作。

4

2 回答 2

10

有几个。截至 2020-04 年,10 个国家/地区共有 14 个此类时区:巴拉圭、古巴、智利、格陵兰/丹麦、约旦、黎巴嫩、叙利亚、巴勒斯坦、伊朗和亚速尔/葡萄牙。

在 2019-04 之前,该列表包括使用时区的巴西。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 年日期的所有区域,其中日期的开始不是午夜。它的输出列出了我机器上的所有时区和截至 2020 年符合您要求的 Java 版本,以及非午夜开始的日期和时间。

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 回答