gpt4 book ai didi

java - MySQL DATETIME 和 TIMESTAMP 到 java.sql.Timestamp 到 ZonedDateTime

转载 作者:行者123 更新时间:2023-11-29 02:49:02 24 4
gpt4 key购买 nike

我想知道转换是如何进行的。 MySQL 服务器 (5.6) 将 TIMESTAMP 视为区域调整(并在内部存储在 UTC 中/从 UTC 检索)。它还将 DATETIME 视为没有区域。

在 Java 方面,无论哪种情况,我都建议读入 java.sql.Timestamp。是否存在从 MySQL 的 DATETIME 到 java.sql.Timestamp 的区域类型转换(通过 MySQL 连接器 5.1.37 时)(例如应用客户端系统区域)?

最后,我的服务器和客户端只有一个区域,因此我维护一个特定的 ZoneId(在应用程序代码中)以到达 ZonedDateTime。但我想使用 ZonedDateTime,来回访问存储为 DATETIME 的数据库。一个简单的转换示例将不胜感激!

最佳答案

让我们解决您的每个问题。第一:

Is there a zone-type conversion taking place (when going through MySQL-connector 5.1.37) from MySQL's DATETIME to java.sql.Timestamp (such as to apply the client system zone)?
首先,我假设您正在使用 getTimestamp(int)来自连接器的方法。我找不到向我展示启发性答案的官方来源;然而,有一个问题,其中 answer声明:
When you call getTimestamp(), MySQL JDBC driver converts the time from GMT into default timezone if the type is timestamp. It performs no such conversion for other types.
然而,在 this该方法的版本,它使用底层 Calendar 转换 TimestampTimeZone指定,如果基础数据库不存储时区信息。这可能是您第二个问题的解决方案,只要您知道存储值的时区(您知道)。但如果不是,似乎第一种方法没有发生转换,至少在它检索 DATETIME 时是这样。 .说到你的第二个问题:
But I would like to work with ZonedDateTime, going back and forth to the database stored as DATETIME.
这让我觉得只要您知道 您要从哪个时区转换,就有办法做到这一点。正如我们之前所说,您和您的客户只使用一个 ZoneId , 这完全没问题。但是,提供此答案是为了与更多时区一起使用。多个 ZoneId如果您要存储 ZoneId 则可以实现数据库中的连接;检索它以及 DATETIME最后将这些值处理成 ZonedDateTime .您可以存储 ZoneId使用 the ID's 进入数据库的 ZoneId类(如果你愿意的话)。

Timestamp t = resultSet.getTimestamp(timestampColumnId);
ZoneId zoneId = ZoneId.of(resultSet.getString(zoneColumnId), ZoneId.SHORT_IDS);
ZonedDateTime d = ZonedDateTime.ofInstant(t.toInstant(), zoneId);

或者,您可以只存储 DATETIME作为TIMESTAMP在数据库中为 ZZ Coder在他的上述回答中建议。但是,您可以只使用 ZoneId你有这样的硬编码:

Timestamp t = resultSet.getTimestamp(timestampColumnId);
ZonedDateTime d = ZonedDateTime.ofInstant(t.toInstant(), zoneId);

编辑
看着 source code , 在使用 getTimestamp(int, Calendar) 获取或设置调用时或 setTimestamp(int, Timestamp, Calendar)函数,Calendar 的时区用来。但是,在某些情况下使用 TIMESTAMP , 当 Calendar未使用时,JDBC 然后使用服务器的时区。根据原始海报,它有效(请参阅下面的 comment)。

关于java - MySQL DATETIME 和 TIMESTAMP 到 java.sql.Timestamp 到 ZonedDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38063851/

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