【问题标题】:Java: Local Standard Time to InstantJava:本地标准时间到即时
【发布时间】:2019-11-02 13:45:13
【问题描述】:

this 这样的服务有一个明确的说明

所有时间均以当地标准时间 (LST) 指定。增加 1 小时 调整观察时间和地点的夏令时。

给定一个LocalDateTime 对象ldt,创建一个瞬间就像 Instant.of(ldt,zoneId)。但是,如果我提供ZoneId,那么Instant 将假定已经进行了夏令时(DST)调整,而ldt 是针对DST,但事实并非如此。 使Instant 的构造函数应用“标准”偏移而不考虑夏令时的最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));

【问题讨论】:

  • 嗨,也许用ZoneId.getRules()

标签: java dst java-time


【解决方案1】:

您可以通过调用getRules() 然后调用getStandardOffset() 来获取ZoneId 的标准偏移量。

但是,您需要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());
}

更新:

但即便如此,对于某些非常极端的情况,这仍会产生错误的结果。问题是 java.time 没有提供以标准偏移量获取转换的方法。

【讨论】:

    【解决方案2】:

    ZonedDateTime 描述指出:

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

    使用区域标识符将LocalDateTime 对象转换为ZonedDateTimeatZone

    然后调用继承自ChronoZonedDateTime类的默认toInstant方法,得到Instant对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-27
      • 2015-09-28
      • 2011-10-30
      • 1970-01-01
      • 2017-02-11
      • 2012-05-31
      • 2022-10-13
      相关资源
      最近更新 更多