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

时间:2015-09-08 15:08:50

标签: java calendar timestamp

我的日期为ISO 8601日期格式function e()。我使用此代码将ISO 8601命运转换为Calendar对象:

2015-09-08T01:55:28Z

现在我需要使用Calendar cal = javax.xml.bind.DatatypeConverter.parseDateTime("2015-09-08T01:55:28Z"); 来获取时间,但我需要将其转换为cal.getTime()。我试着这样做:

java.sql.Timestamp

但是我收到了这个错误:

final Timestamp finalDate = (Timestamp) cal.getTime();

想法?

2 个答案:

答案 0 :(得分:11)

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

使用:

Timestamp timestamp = new Timestamp(cal.getTimeInMillis());

并且还考虑将Calendar替换为Java SE 8中引入的新Date & Time API

答案 1 :(得分:4)

Puce的

The Answer是正确的。

java.time

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

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

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

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

从即时消息中,我们可以通过调用新添加到此旧类的java.sql.Timestamp方法获得from

java.sql.Timestamp ts = java.sql.Timestamp.from( instant );

我们可以将所有三条线组合成一条线,而不是我推荐它(使调试变得更加困难)。

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

数据库通过java.time类型

JDBC 4.2开始,符合条件的JDBC driver应该能够通过PreparedStatement上的getObjectsetObject传递java.time类型。如果您的驱动程序没有,请使用旧类的转换方法。

myPreparedStatement.setObject( 1 , instant );