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

时间:2016-07-25 08:38:50

标签: java date datetime

我有一个字符串" 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);

2 个答案:

答案 0 :(得分:3)

你正在使用现在被java.time类取代的麻烦的旧类。

以下是如何遵循Jon Skeet在该问题的评论中发表的建议。

java.time

java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormatJoda-Time团队还建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的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中时间轴上的一个时刻,分辨率高达纳秒。从Instant中提取OffsetDateTime

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类的使用。

答案 1 :(得分:0)

您的代码有一个问题

 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()获取系统的默认时区。

相关问题