为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

倚天杖 2019-04-10 18:19:22
我们在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类。这些现代类在几年前取代了可怕的日期时间类,如DateSimpleDateFormat。以下是该方向的一些示例代码。

表格中的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 列。


查看完整回答
反对 回复 2019-05-15
  • 3 回答
  • 0 关注
  • 619 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信