将第三方库的LocalDateTime转换为Timestamp

时间:2019-05-15 21:05:44

标签: java

我们正在使用org.thirteen.bp库来管理带有时区信息的不同格式。我已经使用其格式将字符串值解析为LocalDateTime,但是有什么方法可以将org.thirteen.bp.LocalDateTime转换为java.sql.Timestamp

2 个答案:

答案 0 :(得分:2)

  

有什么方法可以将org.thirteen.bp.LocalDateTime转换为java.sql.Timestamp?

是:DateTimeUtils.toSqlTimestamp

DateTimeUtils类提供a conversion method

LocalDateTime ldt = LocalDateTime.parse( "2019-01-23T01:23:45" ) ;
java.sql.Timestamp ts = org.threeten.bp.DateTimeUtils.toSqlTimestamp( ldt ) ;

...但是...

您应该知道,使用LocalDateTime存储java.sql.Timestamp对象是很糟糕的事情。

LocalDateTime不能代表片刻,但是Timestamp可以代表片刻。

问题在于,在 java.time 类和JSR 310出现之前,Java无法在没有时区或偏移量的情况下表示日期和时间。来自-UTC。因此,没有可以追溯到TIMESTAMP WITHOUT TIME ZONE的SQL标准类型的类。他们使用Timestamp进行了伪造。这是早期Java团队成员做出的许多糟糕的设计决策之一,他们显然不了解日期时间处理中涉及的问题。

有关更多说明,请参见Ole V.V的this Answer。在类似的问题上。

当最终使用Java 8或更高版本,并且可以从 ThreeTen-Backport 过渡到使用内置的 java.time 类时,可以完全避免使用使用java.sql.Timestamp

LocalDateTime ldt = LocalDateTime.parse( "2019-01-23T01:23:45" ) ;
myPreparedStatement.setObject( … , ldt ) ;  // Appropriately storing a date and time-of-day without zone/offset into a database column of type TIMESTAMP WITHOUT TIME ZONE.

检索。

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

大概正在使用 ThreeTen-Backport ,因为您仍在使用Java 6或Java7。这意味着您没有JDBC 4.2或更高版本。因此,您必须使用此答案顶部所示的hack。

Table of date-time types in Java (both modern & legacy) and in standard SQL.

答案 1 :(得分:-1)

好像您提到的库是Java 8 Date and Time API的fork。

您应该可以使用以下代码获取java.sql.Timestamp

new java.sql.Timestamp(LocalDateTime.getLong(ChronoField.INSTANT_SECONDS))