我正在尝试将 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 Time 的 18: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 的偏移量。 Instant
、java.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/