我们将日期作为 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/