使用以下代碼:
class Test {
public static void main(String [] args) {
LocalDate date = LocalDate.of(2018, 11, 4);
LocalTime time = LocalTime.of(1, 59);
ZonedDateTime dt = ZonedDateTime.of(date, time, ZoneId.of("America/New_York"));
System.out.println(dt.getHour() ":" dt.getMinute() ":" dt.getSecond());
dt = dt.plusMinutes(1);
System.out.println(dt.getHour() ":" dt.getMinute() ":" dt.getSecond());
dt = dt.plusMinutes(59);
System.out.println(dt.getHour() ":" dt.getMinute() ":" dt.getSecond());
dt = dt.plusMinutes(1);
System.out.println(dt.getHour() ":" dt.getMinute() ":" dt.getSecond());
}
}
我明白了
1:59:0
1:0:0
1:59:0
2:0:0
有沒有辦法從夏令時之后到達 1:00:00 而無需從夏令時之前經過 1:00:00?
uj5u.com熱心網友回復:
用于ofStrict指定您希望生成的磁區日期時間在哪個偏移量上。America/New_York大約在相關時間從 -04:00 變為 -05:00,所以你想要ZoneOffset.ofHours(-5).
ZonedDateTime dt = ZonedDateTime.ofStrict(
LocalDateTime.of(date, time),
ZoneOffset.ofHours(-5),
ZoneId.of("America/New_York")
);
如果您無法硬編碼偏移量,您可以在使用后獲取偏移量:
var dateTime = LocalDateTime.of(date, time)
var zone = ZoneId.of("America/New_York");
var offsetAfter = zone.getRules()
.getTransition(dateTime)
.getOffsetAfter();
ZonedDateTime dt = ZonedDateTime.ofStrict(
dateTime,
offsetAfter,
zone
);
或者,正如 Ole VV 指出的那樣,您也可以使用更短的:
ZonedDateTime dt = ZonedDateTime.of(
date, time, ZoneId.of("America/New_York")
).withLaterOffsetAtOverlap();
uj5u.com熱心網友回復:
遵守夏令時的時區的問題在于這些時間是不明確的。“America/New_York”區域有兩個時間都標記為 2008-11-04T01:00:00。從技術上講,其中一個是美國東部時間 01:00,另一個是美國東部標準時間 01:00,但并不是很多軟體都能讓您以這種方式進行區分,尤其是因為這樣的三個字母時區名稱不一定是全球唯一的。
解決方案是指定時間或相對于世界時,沒有夏令時:東部時間的第一個 01:00 是 05:00Z,第二個是 06:00Z。因此,您可以將時間作為其中之一,將區域作為“UTC”(然后將結果轉換為“America/New_York”),或者使用ofStrict.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/442397.html
上一篇:R一種更快的作業日方法
