tl;博士
Timestamp // Avoid this terrible legacy class if possible. Represents a moment in UTC.
.from( // Convert from modern `Instant` to legacy `Timestamp`. No data loss, as both resolve to nanoseconds.
OffsetDateTime // Modern way to represent a moment with an offset-from-UTC (hours, minutes, and seconds).
.parse( "2019-04-06T00:43:21+00:00" ) // Parse standard ISO 8601 strings. Returns a `java.time.OffsetDateTime` object.
.toInstant() // Extract an `Instant` from the `OffsetDateTime`, thereby adjusting to UTC (an offset of zero).
) // Returns a `Timestamp` object, if needed to interoperate with old code not yet updated to *java.time*.
更好的是,完全跳过糟糕的Timestamp 课程。
myPreparedStatement.setObject( // As of JDBC 4.2 and later, exchange *java.time* objects with your database.
1 , // Specify the nth placeholder in your SQL statement.
OffsetDateTime.parse( "2019-04-06T00:43:21+00:00" ) // Parse an ISO 8601 compliant string as a `OffsetDateTime` object, a moment with an offset-from-UTC. Pass to the database via the `setObject` call.
)
OffsetDateTime
您的输入字符串表示offset-from-UTC(小时-分钟-秒数),该部分位于末尾。
您的输入字符串采用标准ISO 8601 格式。 java.time 类在解析/生成字符串时默认使用这些格式。所以不需要指定格式模式。
OffsetDateTime odt = OffsetDateTime.parse( "2019-04-06T00:43:21+00:00" ) ;
java.sql.Timestamp
永远不要使用java.util.Timestamp。那个可怕的类在几年前被现代的 java.time 类所取代。
如果您必须有一个Timestamp 对象才能与尚未更新到java.time 的旧代码互操作,请通过调用添加到旧类的新方法进行转换。从OffsetDateTime 中提取Instant(对于UTC 本身,从任何偏移量调整到零偏移量)。将Instant 对象传递给Timestamp.from。
java.sql.Timestamp ts = Timestamp.from( odt.toInstant() ) ;
JDBC 4.2
从 JDBC 4.2 开始,我们可以与数据库交换 java.time 对象。
myPreparedStatement.setObject( … , odt ) ;
检索。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
所有这些都已经在 Stack Overflow 上多次介绍过。所以搜索更多信息。并且在将来,在发布之前彻底搜索。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。