为了账号安全,请及时绑定邮箱和手机立即绑定

需要在 spring-boot 应用程序中将本地日期从 Json 输入持久化到 oracle DB

需要在 spring-boot 应用程序中将本地日期从 Json 输入持久化到 oracle DB

狐的传说 2022-11-02 16:42:24
我有字符串格式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 时区相同的日期
查看完整描述

2 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

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

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


查看完整回答
反对 回复 2022-11-02
?
POPMUISE

TA贡献1765条经验 获得超5个赞

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 ) ;


查看完整回答
反对 回复 2022-11-02
  • 2 回答
  • 0 关注
  • 203 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号