java - 当 java 代码以 UTC 执行时,如何在 ET 中存储一个带有偏移量的日期

标签 java datetime timezone timezone-offset date

我们将日期作为 varchar 存储在 sqlserver 数据库表中。 当它在 java 代码中作为字符串读取然后解析为日期时,它被读取为 UTC(java 代码位于 UT 中的服务器中)。在将日期重新转换为 ET 时,它落后了 4 小时。我如何处理将日期存储在该数据库列中的 ET 中,以便在 Java 代码中将其读取为 ET。

我们正在研究偏移量,但不了解具体要做什么。

Varchar date in table 03/29/2019 23:23:03//我们希望这个日期在 ET 中

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date beginDate = sdf.parse("03/29/2019 23:23:03");

//问题是当这段代码执行时,服务器是UTC。所以 beginDate//读作 03/29/2019 23:23:03 UTC 而不是 03/29/2019 23:23:03 ET

预计 03/29/2019 23:23:03 ET 实际 03/29/2019 23:23:03 UTC

最佳答案

首先,您需要知道 Date 对象根本没有时区。时间只是一瞬间。因此,即使您已正确解析该值,它也会代表正确的时间,但您稍后可能需要将其转换回东部时间。

其次,您需要注意像这样存储值会引入歧义 - 如果您存储值(比如)11/03/2019 01:30,则本地时间出现两次 - 一次在夏令时转换之前,一次然后。如果你总是存储过去的时间,你至少应该考虑存储UTC——虽然that's not always the right answer, particularly not if you're storing future date/time values .

对于解析部分,您只需要在SimpleDateFormat 使用的Calendar 中设置时区即可。例如:

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York");
Date beginDate = sdf.parse("03/29/2019 23:23:03");

最后,我强烈建议您尽可能开始迁移代码以使用java.time。这是一个比 java.util.Date 等 API 更好的 API。

关于java - 当 java 代码以 UTC 执行时,如何在 ET 中存储一个带有偏移量的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56135120/

相关文章:

java - 如何在Java(Android)中将字节数组列表作为json参数发送?

java - CouchDB数据复制

c# - 验证日期是否在 SqlDbType.DateTime 范围内

datetime - 为什么 SQLite 将数据类型隐藏在存储的日期后面?

javascript - 如何使用时区将以毫秒为单位的时间转换为不同的本地时间

c# - 使用时区将字符串格式化为日期时间

java - 在循环中创建最终变量

java - 面临 JPA 合并问题。合并操作未反射(reflect)在数据库中并且查询执行了两次

c# - DateTime as empty String or null ?如何检查?

elasticsearch - elasticsearch 现在的时区