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。