Java oracle中的日期保存不适用于ISO 8601标准

Java oracle中的日期保存不适用于ISO 8601标准,java,java-time,Java,Java Time,我一直试图在oracle数据库中保存带有偏移量的日期,我设法找到带有时区偏移量的时间戳的等效数据类型 我正试图把这个坚持到DB。我从用户界面收到这些日期(预期格式符合ISO-8601)。我有以下代码。POJO包含两个字段 @Column(columnDefinition = "TIMESTAMP WITH TIME ZONE") private ZonedDateTime zonedDateTime; @Column(columnDefinition = "TIMESTAMP WITH TIM

我一直试图在oracle数据库中保存带有偏移量的日期,我设法找到带有时区偏移量的时间戳的等效数据类型

我正试图把这个坚持到DB。我从用户界面收到这些日期(预期格式符合ISO-8601)。我有以下代码。POJO包含两个字段

@Column(columnDefinition = "TIMESTAMP WITH TIME ZONE")
private ZonedDateTime zonedDateTime;

@Column(columnDefinition = "TIMESTAMP WITH TIME ZONE")
private OffsetDateTime offSetDateTime;
DTO具有相同数据类型的相同字段,但具有
@JsonFormat
注释,如下所示:

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZ")
private ZonedDateTime zonedDateTime;

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZ")
private OffsetDateTime offSetDateTime;
我从邮递员那里经过的日期如下:

{
   "zonedDateTime"  : "2011-07-04T17:19:56.235+07:00",
   "offSetDateTime" : "2011-07-04T17:19:56.235+07:00"
}
数据库中保存的内容如下:

2011年7月4日03.49.56.235000000下午亚洲/加尔各答 2011年7月4日03.49.56.235000000下午亚洲/加尔各答

我想在数据库中以相同的格式保存上述传递的JSON日期,即“2011-07-04T17:19:56.235+07:00”,并希望以相同的时区格式检索它

有人能帮忙吗

另外,我正在使用oracle 12 DB。如何使用Java实现这一点


感谢阅读。

Oracle以自己的内部格式存储日期和时间戳。您只是看到客户机选择如何显示它们(可能使用NLS会话设置)。如果您想查看特定格式的值,则需要将其转换为字符串;使用CTE作为样本值:

with your_table (zonedDateTime) as (
  select to_timestamp_tz('04-JUL-11 03.49.56.235000000 PM ASIA/CALCUTTA', 'DD-MON-RR HH:MI:SS.FF9 AM TZR')
  from dual
)
select zonedDateTime as session_format,
  to_char(zonedDateTime, 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM') as iso_format
from your_table;

SESSION_FORMAT                                ISO_FORMAT                         
--------------------------------------------- -----------------------------------
04-JUL-11 03:49:56.235000000 PM ASIA/CALCUTTA 2011-07-04T15:49:56.235+05:30      
时区似乎是作为保存过程的一部分进行转换的,可能是执行插入时客户端和服务器时区之间的差异隐式转换的;但这是同一个时间点

作为该查询的一部分,您可以转换回特定的时区偏移:

select zonedDateTime as session_format,
  to_char(zonedDateTime at time zone '+07:00', 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM') as iso_format
from your_table;

SESSION_FORMAT                                ISO_FORMAT                         
--------------------------------------------- -----------------------------------
04-JUL-11 03:49:56.235000000 PM ASIA/CALCUTTA 2011-07-04T17:19:56.235+07:00      
。。。尽管您可能希望使用时区区域名称,而不是固定偏移量


如果将数据拖回任何应用程序填充它,您可能还需要考虑将其查询为原始数据类型而不是字符串,然后将其格式化为从应用层显示/输出/向前的JSON行程。

< P>如上面提到的,日期正在正确存储。(使用具有UDT时间戳和时区的内部格式),但您的客户端正在以其默认格式显示此日期

如果需要以所选的格式检索值,而不考虑客户机,则需要使用to_CHAR函数以适当的日期格式编写SELECT语句

请参见此处的TO_CHAR用法:


请参见此处的日期格式:

但时间戳不是用格式保存的;它只是用一种格式显示。如果需要保存格式,则必须将其保存为文本。用于显示的格式在会话或用于此的工具中设置好,但在这种情况下,我也会丢失时区值,那么我如何存储偏移量?或者我将其存储为字符串或单独存储偏移量并将其转换?