gpt4 book ai didi

Java - ZonedDateTime 没有正确转换为 Date 对象?

转载 作者:行者123 更新时间:2023-12-04 12:19:09 25 4
gpt4 key购买 nike

我有以下 Java 代码:

Date convertedDate = Date.from(zonedDateTime.toInstant());
我遇到的问题是 convertedDate与 zonedDateTime 对象相比不正确。
例如,当我有一个 zonedDateTime 对象时:
2021-09-16T12:00
带区域:
Africa/Abidjan
上面的代码将其转换为:
Thu Sep 16 13:00:00 BST 2021
我在这里期待的是
 Thu Sep 16 10:00:00 BST 2021
Africa/Abidjan时区比 BST 早 2 小时。
我该如何解决这个问题?

最佳答案

时间java.util日期时间 API 及其格式 API,SimpleDateFormat过时且容易出错。建议完全停止使用它们并切换到modern Date-Time API *.
使用 java.time 的解决方案,现代日期时间 API:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
public static void main(String[] args) {
// The given ZonedDateTime
ZonedDateTime zdtAbidjan = ZonedDateTime.of(
LocalDateTime.of(LocalDate.of(2021, 9, 16),
LocalTime.of(12, 0)),
ZoneId.of("Africa/Abidjan")
);
System.out.println(zdtAbidjan);

ZonedDateTime zdtLondon = zdtAbidjan.withZoneSameInstant(ZoneId.of("Europe/London"));
System.out.println(zdtLondon);
}
}
输出:
2021-09-16T12:00Z[Africa/Abidjan]
2021-09-16T13:00+01:00[Europe/London]
ONLINE DEMO
  • Z在输出中是 timezone designator对于零时区偏移。它代表祖鲁语并指定 Etc/UTC时区(时区偏移为 +00:00 小时)。
  • 从输出中可以清楚地看出 2021-09-16T12:00Z[Africa/Abidjan] 等于 2021-09-16T13:00+01:00[Europe/London]。

  • 了解有关现代日期时间 API 的更多信息Trail: Date Time .

    * 无论出于何种原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport它将大部分 java.time 功能向后移植到 Java 6 和 7。如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请查看 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project .

    关于Java - ZonedDateTime 没有正确转换为 Date 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68442742/

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