我在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
任何帮助表示赞赏!
答案 0 :(得分:2)
Stack Overflow已经多次介绍过这个问题。发布前搜索。
如此简短......
使用现代 java.time 类,而不是像Date
/ Calendar
那样麻烦的旧旧日期时间类。
从JDBC 4.2开始,直接与数据库交换 java.time 对象。
Instant
用于TIMESTAMP WITH TIME ZONE
LocalDateTime
用于TIMESTAMP WITHOUT TIME ZONE
LocalDate
用于DATE
致电PreparedStatement::setObject
和ResultSet::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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。