首页 > 解决方案 > 需要在 spring-boot 应用程序中将本地日期从 Json 输入持久化到 oracle DB

问题描述

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

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

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

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

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”。

预期输出:日期对象,值为 20-04-2019 20:15:00 AM CDT。

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

标签: javajsondatedate-conversion

解决方案


java.time

您正在使用几年前被JSR 310 中定义的java.time类取代的糟糕的日期时间类。

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

真正的时区采用格式Continent/Region。例如:Europe/ParisAfrica/Tunis。请参阅维基百科中的列表。

要在时区的上下文中表示日期和时间,请使用ZonedDateTimeclass。

LocalDateTime要存储与区域、使用和ZoneId类分开的日期时间。

数据库

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

以 UTC 捕获当前时刻。

Instant instant = Instant.now() ;

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

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

传递给准备好的语句。

myPreparedStatement.setObject( … , odt ) ;

取回。

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

推荐阅读