Java:本地标准时间即时

标签 java dst java-time

类似 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/

相关文章:

java - 如何用模式格式化 java.time.LocalDateTime 和 java.time.LocalDate?

java - 如何根据当前秒数获取第二天的第一秒?

java - 循环行为无法捕获传入消息

java - 为什么字典初始化时不会发生内存溢出?

Azure 数据工厂考虑 DST 转换时间戳

java - 如何编写单元测试以确保我的基于日期/时间的代码适用于所有时区以及有/无 DST?

javascript - 使用 Javascript 将日期时间转换为 UTC

java - Duration中的 'PT'前缀代表什么?

java - 安装 portmidi 库

java - 如何单独同步数据成员