繁体   English   中英

需要在Spring Boot应用程序中将Json输入到oracle DB的本地日期持久化

[英]Need to persist local date from Json input to oracle DB in a spring-boot application

我在json输入中以字符串格式dd-MM-yyyy HH:mm:ss格式设置了本地日期[让它是任何格式都没有问题],在标头中有一个单独的字段时区[例如CST,CDT等]。 在Java中,当我尝试使用此值和时区创建日期时,将使用我的系统[jvm running system]时区创建日期。

我需要使用输入时区来保留输入的确切日期和时间。 我该怎么做 ?

我什至尝试将日期对象和@DateTimeFormat放在dto中而不是字符串中,但这@DateTimeFormat

我想要一个这样的方法来从输入日期字符串和时区中获取本地日期。

public Date getLocalDate(String dateString, String localTimeZone) {

  SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss a");   
  formatter.setTimeZone(TimeZone.getTimeZone(localTimeZone));        
  return formatter.parse(dateString);
}

输入:dateString:“ 20-04-2019 20:15:00 AM” localTimeZone:“ CDT”。

预期输出:日期为CDT 20-04-2019 20:15:00的Date对象。

实际输出:同一日期与IST-CDT时差与IST时区

关于Date对象的真正含义存在误解。 '01-01-1970 00:00:00 UTC'以来仅几毫秒。 换句话说,它始终是UTC日期/时间,当您尝试打印时,默认格式化程序会在本地时区中将其隐式转换。

如果要同时存储即时 (即UTC日期/时间)和时区,则必须使用Calendar对象。 但是无论如何,如果您想同时在Oracle中存储时间和时区,则应该直接存储一个字符串,或者一个日期和一个字符串(用于时区),因为AFAIK,Oracle DATE字段没有时区的概念。

java.time

您正在使用可怕的日期时间类,而该类在几年前已被JSR 310中定义的java.time类取代。

“ CST”和此类2-4个字符的伪区域不是时区。 它们不是标准化的,甚至不是唯一的! 例如: CST是北美的中部时间,也是中国的标准时间。

真实时区的格式为Continent/Region 例如: Europe/ParisAfrica/Tunis 请参阅Wikipedia中的列表。

若要表示时区上下文中的日期和时间,请使用ZonedDateTime类。

要存储与区域分开的日期时间,请使用LocalDateTimeZoneId类。

数据库

您的评论表明希望将当前时刻存储在数据库中。

在UTC中捕获当前时刻。

Instant instant = Instant.now() ;

要与JDBC 4.2一起使用,请转换为OffsetDateTime

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;

传递给准备好的语句。

myPreparedStatement.setObject( … , odt ) ;

检索。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM