如何将 Oracle 日期格式转换为 Java?

How to convert Oracle Date format to Java?

我有一个 Oracle 日期类型以这种格式 06-MAR-20 存储在数据库中,当我将它映射到 java 域时 class 我有一个 属性类型

java.SQL.Date

但我得到了这种格式的数据

2020-03-06

我怎样才能坚持与我的数据库中存储的内容完全相同的格式? 会

java.SQL.Timestamp

保持不变?

或者在从查询中获取数据时是否需要进行一些配置以保持其格式?

日期没有特定格式。在内部,它们存储为一系列字节,表示其年、月、日、小时、分钟、秒。

当您查看数据库中的日期时,您看到的是一个字符串表示形式,其格式取决于您的会话(如果它指定了一个)或您的数据库(如果该参数未在会话级别设置)。

如果您想以 DD-MON-YY 格式获取日期,您可以在查询中使用 to_char()

to_char(mydatecol, 'DD-MON-YY')

或者您可以在会话级别设置它:

alter session set nls_date_format = 'DD-MON-YY';

我觉得你没有正确搜索 Whosebug。有很多与您在此处提到的问题相关的答案。这将使您更好地了解如何解决问题。

上面的答案只有在你直接使用 JDBC 时才能使用,但通常企业应用程序会使用一些 ORM,然后大部分都与 spring 一起使用。那么您可能无法自由地在任何地方更正 sql,并且不建议为每个域 class 编写 sql。因此,最好为域中的日期属性编写自定义方法,以获取所需格式的日期字符串。示例 getStringDate(java.SQL.Date) 以将其转换为您想要的格式。

Date sqldate = new Date(new java.util.Date().getTime());
System.out.println(sqldate);
SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yy");
System.out.println(format.format(sqldate));

tl;博士

I have an Oracle Date type stored in the db in this format 06-MAR-20

不,你没有。

  • Oracle 等数据库使用它们自己内部定义的二进制值存储日期时间值,而不是纯文本。
  • Oracle DATE 类型包含时间和日期。

DATE = 日期 + 时间

Oracle 数据库中的 DATE 类型命名错误。它包含多个日期(年、月和月中的某天)。

此类型表示一个日期,其时间解析为整秒。这种类型缺少时区或与 UTC 的偏移量的上下文。所以这个类型不能用来表示一个时刻,时间轴上的一个特定点。 (要跟踪片刻,请使用 Oracle 类型 TIMESTAMP WITH TIME ZONE。)

请注意,此 Oracle 命名不同于 SQL 标准。在标准中,DATE 类型是一个仅限日期的值,没有时间,也没有时区或偏移量。

java.time.LocalDateTime

所以这个类型映射到 Java 中的 LocalDateTime

检索。

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

存储。

myPreparedStatement.setObject( … , ldt ) ;

文本

请注意,在上面的代码中,我们使用的是智能对象而不是哑字符串。

诸如 LocalDateTime 之类的日期时间对象不是 String 并且不包含文本。他们以自己的方式在内部代表自己的价值。您可以将字符串解析为日期时间对象,并且可以要求日期时间对象生成文本。但是文本和日期时间对象是独立且不同的。

java.time 类 在 parsing/generating 字符串时使用标准 ISO 8601 格式。

String output = ldt.toString() ;

2020-01-23T01:23:45.123456789

正在解析。

您可以生成其他格式的文本。您可以通过调用 DateTimeFormatter.ofPattern 指定您自己的自定义格式。通常最好通过调用 DateTimeFormatter.ofLocalized… 方法自动格式化。

这已在 Stack Overflow 上多次介绍。所以搜索以了解更多信息。

LocalDateTime ldt = LocalDateTime.parse( "2020-01-23T01:23:45.123456789" ) ;

关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

Joda-Time project, now in maintenance mode, advises migration to the java.time 类.

您可以直接与数据库交换 java.time 对象。使用 JDBC driver compliant with JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* 类。 Hibernate 5 和 JPA 2.2 支持 java.time

在哪里获取java.time类?