【问题标题】:java Instant and MS SQL datetimeoffsetjava Instant 和 MS SQL datetimeoffset
【发布时间】:2021-05-21 10:37:40
【问题描述】:

我用的是spring、mybatis、mssql-jdbc-8.4.1...

我有非常简单的测试代码来保存和从数据库中获取模型。
Model 字段为 Instant 类型,DB 列为 datetimeoffset 类型。

在持久化/获取后,我的时区偏移量正好有时差。
将 DB 列类型更改为 datetime2 可以解决问题。

问:我应该将此视为底层库问题(mybatis 或 jbdc 驱动程序)还是我错误地期望 java Instant 被保存在 UTC 时区并被提取以保持有效的“即时” ?

【问题讨论】:

    标签: java sql-server datetime


    【解决方案1】:

    将 DB 列类型更改为 datetime2 可以解决问题。

    datetime2 是 MS SQL Server 类型,对应于 ANSI SQL TIMESTAMP 类型,它映射到 JDBC 4.2 中的 LocalDateTime。 LocalDateTime 不包含任何时区信息,因此您将始终获得相同的值。

    如果您想以这样一种方式存储它,即检索到的值应在具有不同偏移值的时区中自动更改,则应将其保存到类型为TIMESTAMP WITH TIMEZONE 的数据库字段中,该字段对应于OffsetDateTime。请注意,大多数 JDBC 驱动程序不支持 Instant 和 ZonedDateTime。此外,这些驱动程序中的大多数都要求 OffsetDateTime 实例的时区偏移量为 +00:00 小时,因为后端将它们存储为 UTC。

    查看this answer了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      相关资源
      最近更新 更多