Java:本地标准时间到即时

时间:2019-06-19 18:49:00

标签: java dst java-time

诸如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));

2 个答案:

答案 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)

ZonedDateTime描述如下:

  

此类处理来自本地时间线的转换   LocalDateTime到Instant的即时时间线。区别   两条时间线之间的距离是UTC /格林威治时间的偏移量,   由ZoneOffset表示。

使用区域标识符使用atZoneLocalDateTime对象转换为ZonedDateTime

然后调用从ChronoZonedDateTime类继承的默认toInstant方法来获取Instant对象。