繁体   English   中英

如何将Joda DateTime转换为UTC MySql时间戳

[英]How to convert Joda DateTime to UTC MySql timestamp

我有一个表示UTC时间的Joda DateTime对象,并希望将其存储在MySql表的Timestamp字段中。

我有以下代码:

String ztime = "2013-10-07T08:00:00Z";  

DateTimeFormatter parser = ISODateTimeFormat.dateTimeParser();
DateTime dt = parser.parseDateTime(ztime).withZone(DateTimeZone.UTC);

PreparedStatement stmt = con.prepareStatement("insert into time_test (time) values (?)");
stmt.setTimestamp(1, Timestamp(dt.getMillis()));
stmt.execute();

但是,当我查看数据库时,获取存储的时间超出了我的数据库时区与UTC的差异。 例如,当我的数据库以UTC + 1运行,并运行上述代码以保存“08:00Z”时,数据库中的时间戳显示为09:00。

DateTime的getMillis方法说“从1970-01-01T00:00:00Z的Java纪元获取日期时刻的毫秒数”。 和MySql的Timestamp说:“MySQL将TIMESTAMP值从当前时区转换为UTC进行存储,然后从UTC返回到当前时区进行检索。”所以我认为这是导致问题的MySql转换,因为毫秒是它的初始化时相对于固定的UTC时间,因此无需从当前时区转换为UTC。

我将数据读回到DateTime的代码工作正常,我得到了我输入的值,但我还需要这个来处理一些我无法控制的第三方代码,它需要时间戳到在正确的UTC时间。

如何获取数据库中的Timestamp字段以匹配原始UTC日期/时间?

TL;博士

使用取代Joda-Time的 java.time类。

myPreparedStatement.setObject( 
    … , 
    Instant.parse( "2013-10-07T08:00:00Z" )  
)

检索。

myResultSet.getObject( 
    … ,
    Instant.class 
)

java.time

Joda-Time项目现在处于维护模式,建议迁移到其后续版本,即Java 8及更高版本中内置的java.time类。 两人都是由同一个人斯蒂芬·科勒伯恩领导的。 你会发现很多相同的概念,所以很容易迁移。

Instant类表示UTC时间轴上的一个时刻,分辨率为纳秒 (最多九(9)位小数)。

您的输入字符串恰好是标准的ISO 8601格式。 在解析/生成字符串时, java.time类默认使用这些标准格式。 因此无需指定格式化模式。

String input = "2013-10-07T08:00:00Z" ;     // Standard ISO 8601 format.
Instant instant = Instant.parse( input ) ;  // Parses standard ISO 8601 format by default.

Instant类替换java.util.Datejava.sql.Timestamp 从JDBC 4.2及更高版本开始,您可以直接与数据库交换java.time对象。

myPreparedStatement.setObject( … , instant ) ;

并检索。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

MySQL中的TIMESTAMP类型似乎类似于SQL标准TIMESTAMP WITH TIME ZONE类型。 所以上面的代码应该适当地工作。


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310

您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序 不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM