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

4

我有一个代表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。
我的读取数据的代码可以正常工作,并且我得到了我输入的值,但我还需要将其与某些第三方代码配合使用,这些代码我无法控制,这些代码期望时间戳处于正确的UTC时间。
如何使数据库中的时间戳字段与我的原始UTC日期/时间匹配?
1个回答

0

简而言之

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

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

检索。

myResultSet.getObject( 
    … ,
    Instant.class 
)

java.time

Joda-Time项目现在处于维护模式,建议迁移到其后继者java.time类,该类内置于Java 8及更高版本中。两者均由同一人Stephen Colebourne领导。您会发现许多相同的概念在使用中,因此迁移相对容易。

Instant类表示UTC时间轴上的一个时刻,分辨率为纳秒(最多九个十进制数字)。

您的输入字符串恰好符合标准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及更高版本中。这些类取代了老旧的传统日期时间类,如{{link3:java.util.Date}}、{{link4:Calendar}}和{{link5:SimpleDateFormat}}。

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 可能未来增加内容的试验场。 您可能会在这里找到一些有用的类,例如 Interval, YearWeek, YearQuarter, 和 更多


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接