【问题标题】:convert XMLGregorianCalendar to java.sql.Timestamp将 XMLGregorianCalendar 转换为 java.sql.Timestamp
【发布时间】:2012-09-12 13:33:55
【问题描述】:

我正在尝试将 XMLGregorianCalendar 日期分配给 java.sql.Timestamp var,就像这样...

var1.setTimeStamp(Timestamp.valueOf(var2.getXMLGregorianCalendar().toString()))

但显然,这不起作用,并引发异常...

java.lang.IllegalArgumentException: 时间戳格式必须是 yyyy-mm-dd hh:mm:ss[.fffffffff]

我也试过这个:

var1.setTimeStamp((Timestamp) var2.getXMLGregorianCalendar().getTime())

但是……

java.lang.ClassCastException:java.util.Date 无法转换为 java.sql.Timestamp

任何想法..?谢谢!

【问题讨论】:

    标签: java date timestamp gregorian-calendar


    【解决方案1】:

    我找到了答案:

        Timestamp timestamp = new Timestamp(var2.getXMLGregorianCalendar().toGregorianCalendar().getTimeInMillis());
        var1.setTimeStamp(timestamp);
    

    【讨论】:

      【解决方案2】:

      tl;博士

      尽量避免使用旧的日期时间类。但如果交给javax.xml.datatype.XMLGregorianCalendar,则转换为现代java.time.Instant 类。无需使用java.sql.Timestamp

      myPreparedStatement.setObject( 
          … , 
          myXMLGregorianCalendar  // If forced to work with a `javax.xml.datatype.XMLGregorianCalendar` object rather than a modern java.time class…
          .toGregorianCalendar()  // …convert to a `java.util.GregorianCalendar`, and then…
          .toZonedDateTime()      // …convert to modern `java.time.ZonedDateTime` class.
          .toInstant()            // Adjust to UTC by extracting an `Instant` object.
      )
      

      从数据库中检索,截至JDBC 4.2 及更高版本。

      Instant instant = myResultSet.getObject( … , Instant.class ) ;
      

      java.time

      仅供参考,非常麻烦的旧日期时间类已被 java.time 类所取代。

      避免使用XMLGregorianCalendar。但是,如果您必须与尚未针对 java.time 类型更新的旧代码交互,请转换。作为中间步骤,转换为GregorianCalendar,如您的问题代码所示。

      java.util.GregorianCalendar gc = myXMLGregorianCalendar.toGregorianCalendar() ;
      

      现在使用添加到旧GregorianCalendar 类中的新便捷转换方法,来获得现代java.time.ZonedDateTime 对象。

      ZonedDateTime zdt = gc.toZonedDateTime() ;  // Convert from legacy class to modern class.
      

      从该特定时区调整为UTC。提取一个 Instant 对象,根据定义,该对象始终为 UTC 时刻。

      Instant instant = zdt.toInstant() ;  // Adjust from some time zone to UTC.
      

      从 JDBC 4.2 开始,我们可以直接与数据库交换 java.time 对象。所以再也不用碰java.sql.Timestamp了。

      myPreparedStatement.setObject( … , instant ) ;
      

      检索:

      Instant instant = myResultSet.getObject( … , Instant.class ) ;
      

      关于java.time

      java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

      Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

      要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

      您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

      从哪里获得 java.time 类?

      ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

      【讨论】:

      • 请不要对多个问题添加相同的答案。回答最好的一个并将其余的标记为重复。见Is it acceptable to add a duplicate answer to several questions?
      • @Machavity 我曾考虑将同一作者的此问题和the other Question 标记为重复项。但它们不是重复的。一个简单地询问从XMLGregorianCalendarjava.sql.Timestamp 类。另一个询问该过程中的时区差异。我的other Answer 提供了有关与 UTC 合作以避免这种混淆的额外建议。我的另一个答案遗漏了一些细节和 cmets,请参阅此答案以获取更多信息。
      猜你喜欢
      • 2012-09-24
      • 2013-01-27
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 2012-06-27
      • 2018-12-24
      • 2012-02-18
      • 2017-08-30
      相关资源
      最近更新 更多