我有一个字符串" 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);
答案 0 :(得分:3)
你正在使用现在被java.time类取代的麻烦的旧类。
以下是如何遵循Jon Skeet在该问题的评论中发表的建议。
java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
。 Joda-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::setObject
和ResultSet::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::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
类的使用。
答案 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()
获取系统的默认时区。