java - 从 ZoneDdateTime 转换日期给出本地时间而不是 ZonedTime

标签 java date java-8 zoneddatetime

我正在尝试将 ZonedDateTime 转换为日期。看起来在转换中,它失去了时区并获取了我的本地时间。

System.out.println("zoneDate1::::::::::"+ZonedDateTime.now(ZoneId.of("America/Chicago")));
System.out.println("zoneDate1:Date::::::::::"+Date.from(ZonedDateTime.now(ZoneId.of("America/Chicago")).toInstant()));

以上输出如下:

zoneDate1::::::::::2016-04-15T17:35:06.357-05:00[America/Chicago]
zoneDate1:Date::::::::::Fri Apr 15 18:35:06 EDT 2016

这是因为这是日期类型吗?我将如何进行这种转换并节省分区时间?

最佳答案

有什么问题吗?你期待什么?我没有看到任何不当行为。

您的 java.time 类型 (ZonedDateTime) 分配的时区为 America/Chicago

您的 JVM 显然有一个与北美东海岸相关的指定时区,线索是字符串输出中看到的 EDT 值。 java.util.Date 上的 toString 方法在生成日期时间值的文本表示形式时应用 JVM 当前的默认时区。设计不佳,此行为试图提供帮助,但实际上令人困惑,因为您实际上无法在 java.util.Date 对象上获取或设置此时区。

无论如何,北美东海岸(例如America/New_York时区)比America/Chicago早一个小时。因此,您会看到芝加哥的 17:xx:xx 时间和 Eastern Daylight Saving Time18:xx:xx 时间。 。这些值是正确的。

在调查旧日期时间类的行为时,您应该调用 java.util.TimeZone.getDefault()

java.time

更大的问题是您甚至使用这些旧的日期时间类,例如 java.util.Date/.Calendar。它们设计不佳、令人困惑且麻烦。完全避免这些旧类(class)。它们已在 Java 8 及更高版本中被 java.time 框架取代。

此外,请避免使用 3-4 个字母的区域缩写,例如 EDT。这些既不是标准化的也不是唯一的。使用proper time zone names采用大陆/地区格式。

即时

要捕获 java.time 中的当前日期时间,只需使用 Instant 。此类捕获 UTC 中时间线上的一个时刻。 。您的大部分工作都在 UTC 中完成。不需要时区,除非用户在用户界面中显示时需要时区。

Instant now = Instant.now();

数据库

要发送到数据库,首先请确保已将表中的列定义为符合 SQL 标准TIMESTAMP WITH TIME ZONE 的内容。顺便说一句,不同数据库对日期时间类型的支持各不相同,有些数据库比其他数据库做得更好。

希望 JDBC 驱动程序有一天能够更新以直接处理 java.time 类型。在那之前,我们在向数据库传输数据或从数据库传输数据时必须转换为 java.sql 类型。旧的 java.sql 类具有新方法来促进这些转换。

java.sql.Timestamp

对于像Instant这样的日期时间值,我们需要 java.sql.Timestamp类及其from( Instant )方法。

java.sql.Timestamp ts = java.sql.Timestamp.from( now );

避免使用java.sql.Timestamp,因为它是早期 Java 日期时间类的旧设计糟糕的困惑的一部分。仅将它们用于数据库传输,然后立即转移到 java.time。

Instant instant = ts.toInstant();

如此简单,不涉及时区或与 UTC 的偏移量。 Instantjava.sql.Timestamp 和数据库存储全部采用 UTC

ZonedDateTime

当您确实需要转移到某个地方的wall-clock time时,应用时区。

ZoneId zoneId = ZoneId.of( "America/Chicago" );  // Or "America/New_York" and so on.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

关于java - 从 ZoneDdateTime 转换日期给出本地时间而不是 ZonedTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36657941/

相关文章:

java - 如何将具有唯一字段的对象添加到 Set

Java-Try 和 Catch 语句

java - 用于自动更新的mysql中的触发器出错

java - 为什么使用 Java 的流 API 收集器进行管道分组需要更多时间?

java - 如何在 Java 8 流中增加计数

java - 为什么在 Java 8 的 Comparator 接口(interface)上添加 @FunctionalInterface 注解?

java - 数字的乘积

java - Android Glide 库 NoClassDefFoundError

mysql - 将日期保存到 MySql 时 SQL 语法错误

c# - 非常规年份的 DateTime.ParseExact