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

标签 java jdbc simpledateformat

我在 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::setObjectResultSet::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类?

ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,和more .

关于java - 如何在 Java 中格式化 Oracle 日期和时间戳类型值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49071498/

相关文章:

java - 使用 join 插入表以解析单个元素

java - android.text.format.DateFormat "HH"不像 java.text.SimpleDateFormat 那样被识别

java - Java SimpleDateFormat 的奇怪 ArrayIndexOutOfBoundsException

java - JFrame从一个类到另一个类的内部框架

java - 最终变量 System.out 如何更改其引用?

java - 如何为生成的 DAO 查找创建 RecordN

java - 平面文件下载并保存在数据库中

java - 使用 Java J2SE 获取 mp3 文件的持续时间(以秒和毫秒为单位)

Java + MySQL - 语法错误但语句正确

java - Java 日期解析异常