我们在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
3 回答
幕布斯7119047
TA贡献1794条经验 获得超8个赞
你应该使用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 列。
添加回答
举报
0/150
提交
取消