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

我有以下 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都已经过时,而且容易出错。建议完全停止使用它们并切换到现代 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输出是时区标志为零时区偏移。它代表祖鲁语并指定Etc/UTC时区(时区偏移为+00:00小时)。

  • 从输出中可以清楚地看出 2021-09-16T12:00Z[Africa/Abidjan] 等于 2021-09-16T13:00+01:00[Europe/London]。

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


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和您的 Android API 工作级别仍然不符合 Java-8,检查通过脱糖和可用的 Java 8+ APIHow to use ThreeTenABP in Android Project。


以上是Java-ZonedDateTime没有正确转换为Date对象?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>