我的日期为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();
想法?
答案 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)
The Answer是正确的。
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
上的getObject
和setObject
传递java.time类型。如果您的驱动程序没有,请使用旧类的转换方法。
myPreparedStatement.setObject( 1 , instant );