诸如this之类的服务具有明确的注释
所有时间均在本地标准时间(LST)中指定。加上1小时 调整夏令时的时间和地点。
给出一个LocalDateTime
对象ldt
,创建一个瞬间就像
Instant.of(ldt,zoneId)
。但是,如果我提供了ZoneId
,则Instant
将假定已经进行了夏令时(DST)调整,并且ldt
相对于DST,不是这种情况。
使Instant
的构造函数应用“标准”偏移量而不考虑DST的最类似于Java的方法是什么?
编辑:我的意思是,除了给定年份的硬编码检查之外,DST转换的确切日期吗?当然,我可以获得
ZoneOffset offset= ZoneOffset.of(zoneId)
,然后从给定的时间戳中减去offset.getTotalSeconds()
,以移至“参考”时间。但是仍然将经过参考调整的时间戳记赋予Instant
具有DST的相同问题。
编辑:如以下所建议,我尝试了此操作:
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));
答案 0 :(得分:2)
您可以先调用ZoneId
,然后再调用getStandardOffset()
,以获取getRules()
的标准偏移量。
但是,您需要一个Instant
。因为有时标准偏移也会改变...
因此,一种方法是首先使用LocalDateTime
处的偏移量将Instant
转换为LocalDateTime
。然后,我们在那一刻获得标准偏移量,并使用它来获取我们想要的实际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());
}
答案 1 :(得分:0)