没有午夜的一天

时间:2013-08-28 13:52:57

标签: timezone

至少有一个时区从“ 23:59:59 ”跳到 1:00:00 时为DST“向前弹跳”。有谁知道它是什么?

以下通常是今天的日期,但是对于符合上述标准的时区,它每年都会失败一天。

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

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

2 个答案:

答案 0 :(得分:7)

有几个。常见的是使用America/Sao_Paulo时区的Brazil

$ 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

请参阅this documentation

答案 1 :(得分: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个国家/地区:巴拉圭,古巴,智利,格陵兰/丹麦,约旦,黎巴嫩,叙利亚,巴勒斯坦,伊朗和亚速尔群岛/葡萄牙。