【问题标题】:Convert java.util.Calendar ISO 8601 format to java.sql.Timestamp将 java.util.Calendar ISO 8601 格式转换为 java.sql.Timestamp
【发布时间】:2015-12-04 08:17:54
【问题描述】:

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

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

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

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

但我得到了这个错误:

java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Timestamp

想法?

【问题讨论】:

  • new java.sql.Timestamp(cal.getTime().getTime())
  • 宾果游戏!工作!谢谢你,兄弟!你应该把这个作为答案,这样我就可以投票给你,

标签: java calendar timestamp


【解决方案1】:

正如异常所说:Calendar::getTime() 返回一个java.util.Date 对象,而不是java.sql.Timestamp 对象。所以你不能将它转换为 Timestamp 对象。

用途:

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

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

【讨论】:

    【解决方案2】:

    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 类型的数据库

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

    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 应该能够通过getObjectsetObjectPreparedStatement 上传递java.time 类型。如果您的驱动程序没有,请使用旧类的转换方法。

    myPreparedStatement.setObject( 1 , instant );
    

    【讨论】:

      猜你喜欢
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 2013-07-07
      相关资源
      最近更新 更多