我在 Oracle 数据库中有日期和时间戳类型字段,我需要检索这些值并将它们映射到我的对象字段。尽管我格式化了值,但我没有得到预期的结果。这是我的代码片段。
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
感谢任何帮助!
最佳答案
Stack Overflow 上已经对此进行了多次介绍。发帖前先搜索。
简单说一下……
使用java.time
使用现代的java.time类,而不是麻烦的旧的遗留日期时间类,例如Date
/Calendar
。
使用智能对象,而不是哑字符串
从 JDBC 4.2 开始,直接与数据库交换 java.time 对象。
- 使用
Instant
作为TIMESTAMP WITH TIME ZONE
- 使用
LocalDateTime
作为没有时区的TIMESTAMP
- 使用
LocalDate
表示DATE
调用PreparedStatement::setObject
和ResultSet::getObject
。
myPreparedStatement.setObject( … , instant ) ;
还有……
Instant instant = myResultSet.getObject( … , Instant.class ) ;
请注意,根本没有使用任何字符串。
//Input from 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.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类?
- Java SE 8 , Java SE 9 , 然后
- 内置。
- 是标准 Java API 的一部分,具有捆绑实现。
- Java 9 添加了一些小功能和修复。
- Java SE 6和 Java SE 7
- 许多 java.time 功能已向后移植到 ThreeTen-Backport 中的 Java 6 和 7 .
- Android
- 更高版本的 Android 捆绑了 java.time 类的实现。
- 对于早期的 Android,ThreeTenABP项目采用ThreeTen-Backport(如上所述)。请参阅How to use ThreeTenABP… .
ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
,和more .
关于java - 如何在 Java 中格式化 Oracle 日期和时间戳类型值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49071498/