我有一个字符串"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::setObject
和ResultSet::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::setTimestamp
和ResultSet::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.Date
、java.util.Calendar
和java.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()
获取系统的默认时区。