在java中将字符串转换为"带时区的时间戳"



我有一个字符串"2016-07-21T21:30:47.492+0000",我想将它保存在数据库中数据类型为"TIMESTAMP WITH TIMEZONE"的列中。请提出解决方案。

这就是我所做的:

final SimpleDateFormat mdyFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSX");
final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
final Date d1 = mdyFormat.parse(strDate);
final String mdx = sdf.format(d1);

您使用的是麻烦的旧类,现在已被java.time类取代。

以下是如何遵循Jon Skeet在问题评论中给出的建议。

java.time

java.time框架是在java 8及更高版本中构建的。这些类取代了诸如java.util.Date.Calendar和&java.text.SimpleDateFormat。JodaTime团队还建议迁移到java.Time.

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。

大部分java.time功能都是向后移植到Java6&ThreeTen背包中的7,并在ThreeTenABP中进一步适应Android。

OffsetDateTime

您可以将该输入字符串解析为OffsetDateTime对象。

OffsetDateTime odt = OffsetDateTime.parse( "2016-07-21T21:30:47.492+0000" );

如果JDBC驱动程序符合JDBC 4.2或更高版本,则可以通过PreparedStatement::setObjectResultSet::getObject方法向SQL传递/获取。如果没有,请转换为旧的java.sql类型。

转换需要一个Instant对象。Instant是java.time中更基本的构建块类,缺乏OffsetDateTime的灵活性。Instant类以UTC表示时间线上的一个时刻,其分辨率高达纳秒。从该OffsetDateTime中提取一个Instant

Instant instant = odt.toInstant();

Instant传递给添加到旧java.sql类中的新方法。

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

然后调用PreparedStatement::setTimestampResultSet::getTimestamp方法。

myPreparedStatement.setTimestamp( 1 , ts );
…
java.sql.Timestamp ts = myResultSet.getTimestamp( 1 );

获取java.sql.Timestamp之后,立即转换为java.time类Instant。只有在JDBC驱动程序中缺乏对java.time类型的直接支持的情况下才使用java.sql类,即使这样,也要尽量减少对java.sql类的使用。在java.time.中进行业务逻辑工作

Instant instant = ts.toInstant(); 

混淆类名

不要混淆与Java捆绑在一起的两个旧的Date类。java.util.Date表示日期表示一天中的时间。java.sql.Date旨在只表示一个仅限日期的值,而不表示一天中的时间(但令人困惑的是,由于它是对笨拙类设计的笨拙破解,因此实际上确实有一天的时间)。

完全避免使用java.util.Datejava.util.Calendarjava.text.SimpleDateFormat类。并尽量减少使用上面讨论过的java.sql.Date/.Time/.Timestamp类。

您的代码有一个问题

 String strDate = "2016-07-21T21:30:47.492+0000"; 
        final SimpleDateFormat mdyFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSX");
     // include `T` as well
    final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
    final Date d1;
            try {
                d1 = mdyFormat.parse(strDate);
// to add time zone you  can use below line 
//  sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
                String mdx = sdf.format(d1);
                System.out.println(mdx);
            } catch (ParseException ex) {
            }

不带sdf.setTimeZone(TimeZone.getTimeZone("UTC")) 的输出

22-07-2016

sdf.setTimeZone(TimeZone.getTimeZone("UTC")) 输出

21-07-2016

TimeZone.getDefault()获取系统的默认时区。

相关内容

  • 没有找到相关文章

最新更新