java.time.zone.ZoneRules#nextTransition
不会返回Europe/Moscow 1991年夏令时更改的信息,因此我无法获取Europe/Moscow 1991年夏令时的边界信息。 Europe/Moscow 于1991年3月31日02:00进入夏令时并改变了标准时间偏移量,所以偏移量(+03:00)保持不变而没有Java API可用于获取夏令时开始的该边界。
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.zone.ZoneOffsetTransition;
public class TimeUtilTest {
public static void main(String[] args) {
ZoneId tz = ZoneId.of("Europe/Moscow");
ZonedDateTime yearBegin = ZonedDateTime.of(1991, 1, 1, 0, 0, 0, 0, tz);
ZoneOffsetTransition nextTransition = tz.getRules().nextTransition(yearBegin.toInstant());
System.out.println("year begin isDST=" + tz.getRules().isDaylightSavings(yearBegin.toInstant()));
System.out.println("next transition before is " + nextTransition.getDateTimeBefore() + " isDST=" + tz.getRules()
.isDaylightSavings(nextTransition.getInstant().minusNanos(1)));
System.out.println("next transition after is " + nextTransition.getDateTimeAfter() + " isDST=" + tz.getRules()
.isDaylightSavings(nextTransition.getInstant().plusNanos(1)));
}
}
它返回以下内容:
year begin isDST=false
next transition before is 1991-09-29T03:00 isDST=true
next transition after is 1991-09-29T02:00 isDST=false
您可以看到,在转换之前,isDST被意外更改了。
tz.getRules().isDaylightSavings(ZonedDateTime.of(1991, 3, 31, 1, 59, 59, 999_999_999, tz).toInstant())
返回false,而tz.getRules().isDaylightSavings(ZonedDateTime.of(1991, 3, 31, 2, 0, 0, 0, tz).toInstant())
返回true。如果其他方法都失败了,可以使用二分查找来找到时间。 - Ole V.V.