java - 需要在 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 时区相同的日期
解决方案
java.time
您正在使用几年前被JSR 310 中定义的java.time类取代的糟糕的日期时间类。
“CST”和这样的 2-4 个字符的伪区域不是时区。它们不是标准化的,甚至不是唯一的!例如:CST
是北美中部时间,也是中国标准时间。
真正的时区采用格式Continent/Region
。例如:Europe/Paris
或Africa/Tunis
。请参阅维基百科中的列表。
要在时区的上下文中表示日期和时间,请使用ZonedDateTime
class。
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 ) ;
推荐阅读
- javascript - 即使在检测到国家/地区后如何允许语言更改?
- angularjs - browser.addEventListener 不是函数
- intellij-idea - 无法在 IntelliJ 中使用处理 3
- python - 如何在 SQLAlchemy 中获得孤立的 SQL 语法错误
- visual-studio - 我在离线安装 Visual Studio 2017 时遇到问题
- merge - 使用“将 [分支名称] 合并到当前分支”选项的最佳方法是什么 - SourceTree
- pyinstaller - PyInstaller 导入错误
- microsoft-graph-api - 是否有任何 API 可用于在一个驱动器图 API 中获取垃圾(回收站)项目?
- javascript - PHP 无法上传图片,也看不到 $image 值。所有其他工作,都是关于 ajax,没有刷新表单
- angular - 使用 ng-bootstrap modal Angular 2+ 使模式淡入/淡出