至少有一个时区从“ 23:59:59 ”跳到 1:00:00 时为DST“向前弹跳”。有谁知道它是什么?
以下通常是今天的日期,但是对于符合上述标准的时区,它每年都会失败一天。
$ perl -MDateTime -E'say DateTime->today( time_zone => $ARGV[0] )->ymd;' \
America/New_York
2013-08-28
我需要时区进行测试。我不是想让上面的代码工作。
答案 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
答案 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个国家/地区:巴拉圭,古巴,智利,格陵兰/丹麦,约旦,黎巴嫩,叙利亚,巴勒斯坦,伊朗和亚速尔群岛/葡萄牙。