我们正在使用org.thirteen.bp
库来管理带有时区信息的不同格式。我已经使用其格式将字符串值解析为LocalDateTime,但是有什么方法可以将org.thirteen.bp.LocalDateTime
转换为java.sql.Timestamp
?
答案 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。
答案 1 :(得分:-1)
好像您提到的库是Java 8 Date and Time API的fork。
您应该可以使用以下代码获取java.sql.Timestamp
new java.sql.Timestamp(LocalDateTime.getLong(ChronoField.INSTANT_SECONDS))