当在UTC中执行Java代码时,如何在ET中存储带偏移的日期

Gay*_*tri 4 java timezone datetime timezone-offset java-date

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

我们正在研究偏移量,但并未确切了解该怎么做。

表03/29/2019 23:23:03中的Varchar日期//我们希望此日期位于ET中

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

//问题是执行此代码时,服务器处于UTC状态。因此beginDate //被解读为UTC时间03/29/2019 23:23:03而不是美国东部时间03/29/2019 23:23:03

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

Jon*_*eet 5

首先,你需要知道一个Date对象不具有时区在所有。这只是时间的瞬间。因此,即使您正确解析了该值,它也将表示正确的时间点,但是稍后可能需要将其转换回东部时间。

其次,您需要意识到存储这样的值会带来歧义-如果存储的值是(例如)11/03/2019 01:30,则本地时间会发生两次-一次发生在夏令时之前,一次发生在之后。如果您始终存储过去的时间,则至少应考虑使用 UTC进行存储-尽管这并不总是正确的答案,特别是如果您要存储将来的日期/时间值,则不然

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

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");
Run Code Online (Sandbox Code Playgroud)

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

  • @Gayatri:它会将日期*解析为东部时间*-但生成的`Date`仍然只是时间上的瞬时(2019-01-23T08:00Z)。我建议至少与提供此要求的人员进行交谈,并解释“东部时间存储为varchar”的缺点,以便将来可以重新考虑。 (4认同)