如何在Java中格式化Oracle日期和时间戳类型值?

时间:2018-03-02 14:47:01

标签: java jdbc simpledateformat

我在oracle db中有日期和时间戳类型字段,我需要检索这些值并将它们映射到我的对象字段。虽然我格式化值我没有得到预期的结果。这是我的代码片段。

import java.util.Date;
public class Operation{
private Date created;
private Date valueDate;

public Date getValueDate() {
    return this.valueDate;
}
public void setValueDate(Date valueDate) {
this.valueDate = valueDate;
}
public Date getCreated() {
    return this.valueDate;
}
public void setCreated(Date created) {
this.created= created;
}
}


//here starts code snippet to call db method

SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String formatCreated = df1.format(result.getTimestamp(22)); //Input from db: 23-FEB-18 06.17.42.302680 PM 
//OutputFormat 2018-02-23 18:17:42.000302  
String formatValueDate = df2.format(result.getTimestamp(23));//Input from db:23.02.2018 18:17:42 
//OutputFormat 2018-02-23 18:17:42
Operation op = new Operartion();
op.setCreated(df1.parse(formatCreated)) //Output Fri Feb 23 18:17:42 GMT+04:00 2018
op.setCreated(df1.parse(formatValuedate)) //Output Fri Feb 23 18:17:42 GMT+04:00 2018

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

Stack Overflow已经多次介绍过这个问题。发布前搜索。

如此简短......

使用 java.time

使用现代 java.time 类,而不是像Date / Calendar那样麻烦的旧旧日期时间类。

使用智能对象,而不是哑字符串

从JDBC 4.2开始,直接与数据库交换 java.time 对象。

  • Instant用于TIMESTAMP WITH TIME ZONE
  • LocalDateTime用于TIMESTAMP WITHOUT TIME ZONE
  • LocalDate用于DATE

致电PreparedStatement::setObjectResultSet::getObject

myPreparedStatement.setObject( … , instant ) ;

和...

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

请注意,根本没有使用任何字符串。

  

//来自db的输入:23-FEB-18 06.17.42.302680 PM

不正确的。你的假设是假的。数据库使用自己内部定义的二进制格式来存储日期时间值,而不是字符串/文本。不要将日期时间值与其文本表示混淆。换句话说,日期时间值没有“格式”。

字符串

通过在java.time对象上调用toString来生成标准ISO 8601格式的字符串。

String output = instant.toString() ;

对于其他格式,请使用DateTimeFormatter代替SimpleDateFormat。 Stack Overflow已经很好地覆盖,所以搜索。

关于 java.time

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

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

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

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore