gpt4 book ai didi

Java - Zoneddatetime - 没有夏令时

转载 作者:行者123 更新时间:2023-11-30 02:14:27 29 4
gpt4 key购买 nike

我有一个返回年、月、日和小时的 DTO。因此将值从 DTO 传递到 ZonedDateTime.of 方法。此处,时间显示为太平洋标准时间上午 10 点。因此,尝试将其转换为 UTC。

当传递月份为 5 时,它返回开始时间 17PM;当传递月份为 2 时,它返回开始时间 18PM UTC。正在考虑夏令时。无论月份如何,时间均应为 UTC 晚上 18 点。有什么办法可以忽略这里的夏令时吗?

  TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");

final ZonedDateTime jobStartDateTimeZ = ZonedDateTime.of(2017, 5, 1, 10,
0, 0, 0, tz.toZoneId());

Instant startTime = jobStartDateTimeZ.withZoneSameInstant(ZoneOffset.UTC).toInstant();

System.out.println("Start Time "+startTime);

我们使用旧系统,字符串将位于数据库中的“America/Los_Angeles”中,并且可以是任何时区,例如“America/Bahia”。我们希望针对任何时区处理这种格式。

最佳答案

这可能是黑客攻击;但它有效。

    ZoneId tz = ZoneId.of("America/Los_Angeles");
final ZonedDateTime jobStartDateTimeZ = ZonedDateTime.of(2017, 5, 1, 10, 0, 0, 0, tz);
Instant startTime = jobStartDateTimeZ.toInstant();
// add summer time (DST)
startTime = startTime.plus(tz.getRules().getDaylightSavings(startTime));
System.out.println("Start Time " + startTime);

这会打印

Start Time 2017-02-01T18:00:00Z

这不取决于时区是美洲/洛杉矶还是太平洋/皮特凯恩,也不取决于时区是否使用夏令时 (DST)。如果夏令时在相关时刻生效,它只是补偿夏令时。如果没有夏令时,则添加 0。

顺便说一句,不要使用过时的 TimeZone 类。现代的 ZoneId 是一个很好的替代品。另外,当您之后转换为 Instant 时,withZoneSameInstant() 是不必要的,

关于Java - Zoneddatetime - 没有夏令时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49016594/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com