gpt4 book ai didi

Java:修复日期对象中不正确的时区

转载 作者:行者123 更新时间:2023-12-02 08:58:15 26 4
gpt4 key购买 nike

外部 API 返回带有日期的对象。
根据他们的 API 规范,所有日期始终以 GMT 格式报告。

但是,生成的客户端类(我无法编辑)未正确设置时区。相反,它使用本地时区,而不将日期转换为该时区。

所以,长话短说,我有一个对象,其日期我知道是 GMT,但它显示的是 CET。如何在不更改计算机上的本地时区或执行以下操作的情况下调整此错误:

LocalDateTime.ofInstant(someObject.getDate().toInstant().plus(1, ChronoUnit.HOURS),
ZoneId.of("CET"));

谢谢。

最佳答案

tl;dr ⇒ 使用ZonedDateTime用于转换

public static void main(String[] args) {
// use your date here, this is just "now"
Date date = new Date();
// parse it to an object that is aware of the (currently wrong) time zone
ZonedDateTime wrongZoneZdt = ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("CET"));
// print it to see the result
System.out.println(wrongZoneZdt.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));

// extract the information that should stay (only date and time, NOT zone or offset)
LocalDateTime ldt = wrongZoneZdt.toLocalDateTime();
// print it, too
System.out.println(ldt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

// then take the object without zone information and simply add a zone
ZonedDateTime correctZoneZdt = ldt.atZone(ZoneId.of("GMT"));
// print the result
System.out.println(correctZoneZdt.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
}

输出:

2020-01-24T09:21:37.167+01:00[CET]
2020-01-24T09:21:37.167
2020-01-24T09:21:37.167Z[GMT]
<小时/>

说明:

您的方法不仅纠正了区域,而且还相应地调整了时间(这在需要时很好)的原因是您使用了从 Instant 创建的 LocalDateTime >。 Instant 表示时间中的某个时刻,在不同区域可能有不同的表示,但它保持相同的时刻。如果您从中创建一个 LocalDateTime 并放置另一个区域,则日期和时间将转换为目标区域的日期和时间。这不仅仅是在保持日期和时间不变的情况下替换区域。

如果您使用 ZonedDateTime 中的 LocalDateTime,则提取日期和时间表示形式时会忽略区域,这样您就可以在之后添加不同的区域并保留日期和时间原样。

编辑:如果代码与错误代码在同一 JVM 中运行,您可以使用 ZoneId.systemDefault() 获取与错误代码使用的相同时区。根据喜好,您可以使用 ZoneOffset.UTC 而不是 ZoneId.of("GMT")

关于Java:修复日期对象中不正确的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59892093/

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