类似 this 的服务有明确的说明
All times are specified in Local Standard Time (LST). Add 1 hour to adjust for Daylight Saving Time where and when it is observed.
给定一个 LocalDateTime
对象 ldt
,创建一个瞬间就像
Instant.of(ldt,zoneId)
。但是,如果我提供 ZoneId
,则 Instant
将假定已进行夏令时 (DST) 调整,并且 ldt
与就 DST 而言,情况并非如此。
使 Instant
的构造函数应用“标准”偏移量而不是考虑 DST 的最 Java 风格的方法是什么?
编辑:我的意思是,缺少硬编码检查,对于给定的年份,DST 转换的确切日期?当然,我可以得到偏移量
ZoneOffset offset= ZoneOffset.of(zoneId)
,然后从给定时间戳中减去 offset.getTotalSeconds()
,以移动到“引用”时间。但仍将引用调整时间戳提供给 Instant
夏令时也有同样的问题。
编辑:正如下面所建议的,我尝试了这个:
String str = String.format("%04d-%02d-%02dT%s:00", year, month, day, hourMinutes);
LocalDateTime ldt = LocalDateTime.parse(str);
Instant i1= ldt.toInstant(zoneId.getRules().getOffset(ldt));
Instant key= ldt.toInstant(zoneId.getRules().getStandardOffset(i1));
最佳答案
您可以通过调用 getRules()
获取 ZoneId
的标准偏移量,然后调用 getStandardOffset()
.
但是,您需要一个Instant
。因为有时标准偏移量也会改变......
因此,一种方法是首先使用 LocalDateTime
处的偏移量将 LocalDateTime
转换为 Instant
。然后我们获得该时刻的标准偏移量,并使用它来获得我们想要的实际Instant
:
LocalDateTime ldt = ...;
Instant i = ldt.toInstant(someZoneId.getRules().getOffset(ldt));
Instant i2 = ldt.toInstant(someZoneId.getRules().getStandardOffset(i));
System.out.println(i2);
我认为如果标准偏移量和 DST 偏移量同时更改,这对于某些特定的本地时间不起作用,因为第一个瞬间 i
是使用转换之前的偏移量进行计算。您可以通过执行以下操作来计算 i
以及转换后的偏移量:
Instant i;
ZoneOffsetTransition transition = someZoneId.getRules().getTransition(ldt)
if (transition == null) {
i = ldt.toInstant(someZoneId.getRules().getOffset(ldt));
} else {
i = ldt.toInstant(transition.getOffsetAfter());
}
更新:
但即便如此,对于一些真正的极端情况,这仍会产生错误的结果。问题是 java.time 没有提供以标准偏移量获取转换的方法。
关于Java:本地标准时间即时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56674099/