将java.util.Calendar ISO 8601格式转换为java.sql.Timestamp

Jos*_*des 6 java timestamp calendar

我有ISO 8601日期格式的日期2015-09-08T01:55:28Z.我使用此代码将ISO 8601命运转换为Calendar对象:

Calendar cal = javax.xml.bind.DatatypeConverter.parseDateTime("2015-09-08T01:55:28Z");
Run Code Online (Sandbox Code Playgroud)

现在我需要使用它cal.getTime()来获取我的时间,但我需要将其转换为java.sql.Timestamp.我试着这样做:

final Timestamp finalDate = (Timestamp) cal.getTime();
Run Code Online (Sandbox Code Playgroud)

但是我收到了这个错误:

java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Timestamp
Run Code Online (Sandbox Code Playgroud)

想法?

Puc*_*uce 13

异常说:Calendar::getTime()返回一个java.util.Date对象,而不是一个java.sql.Timestamp对象.因此,您无法将其强制转换为Timestamp对象.

使用:

Timestamp timestamp = new Timestamp(cal.getTimeInMillis());
Run Code Online (Sandbox Code Playgroud)

并且还考虑Calendar使用Java SE 8中引入的新Date&Time API进行替换.


Bas*_*que 6

Puce的答案是正确的。

时间

Java 8 及更高版本中的现代方法是使用新的java.time框架。这些新类取代了旧的 java.util.Date/.Calendar,后者已被证明是令人困惑和麻烦的。

AnInstant是时间轴上的一个时刻,从 UTC 时间 1970 年的第一个时刻开始计算的纳秒数。该类能够解析符合 ISO 8601 格式的字符串。

String input  = "2015-09-08T01:55:28Z";
Instant instant = Instant.parse( input );
Run Code Online (Sandbox Code Playgroud)

通过旧java.sql类型的数据库

从 Instant 中,我们可以通过调用新添加到这个旧类的方法来获取java.sql.Timestampfrom

java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
Run Code Online (Sandbox Code Playgroud)

我们可以将所有三行合并为一行,这不是我推荐的(使调试更加困难)。

 java.sql.Timestamp ts = Timestamp.from( Instant.parse( "2015-09-08T01:55:28Z" ) );
Run Code Online (Sandbox Code Playgroud)

数据库通过java.time类型

由于JDBC 4.2,兼容JDBC驱动程序应该能够通过传递java.time类型getObjectsetObject上一个PreparedStatement。如果您的驱动程序没有,请使用旧类的转换方法。

myPreparedStatement.setObject( 1 , instant );
Run Code Online (Sandbox Code Playgroud)