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

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

我们正在围绕抵消进行研究,但并不了解究竟该做什么。

表格中的Varchar日期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 Actual 03/29/2019 23:23:03 UTC


倚天杖
浏览 625回答 3
3回答

幕布斯7119047

你应该使用JSR 310定义的 java.time类。这些现代类在几年前取代了可怕的日期时间类,如Date和SimpleDateFormat。以下是该方向的一些示例代码。表格中的Varchar日期03/29/2019 23:23:03 //我们希望这个日期在ET中将字符串解析为a LocalDateTime因为我们的输入缺少指向UTC或时区的偏移量。定义格式模式以匹配输入。DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu HH:mm:ss" ) ;解析。LocalDateTime ldt = LocalDateTime.parse( input , f ) ;如果您完全确定此日期和时间适用于特定时区,请应用a ZoneId来获取ZonedDateTime。ZoneId z = ZoneId.of( "America/New_York" ) ;ZonedDateTime zdt = ldt.atZone( z ) ;通过提取来调整为UTC Instant。Instant instant = zdt.toInstant() ;您的JDBC驱动程序可能不接受Instant。因此转换为OffsetDateTime偏移量设置为零小时 - 分钟 - 秒(换句话说,UTC本身)的位置。OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;写入TIMESTAMP WITH TIME ZONE数据库中的类型列。从JDBC 4.2及更高版本开始,我们可以直接用数据库交换java.time对象。myPreparedStatement.setObject( … , odt ) ;并检索。OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;调整到您想要的时区。ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;现在,您已经拥有了进行数据库重构所需的部分,以使用适当的TIMESTAMP WITH TIME ZONE列替换该varchar 列。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java