OffsetDateTime 日期对象未按照在对象中设置日期的方式存储在数据库中

问题描述 投票:0回答:1

我有一个具有 startDateTime 字段的模型,该字段以 OffsetDateTime 格式存储 DateTime。

startDateTime: 2023-07-25T04:40:46.143-08:00

但是,当我们将上述对象存储在 GCP 上的 postgres SQL 数据库中时,它会以以下格式存储:

2023-07-25 12:40:46.143+00

看起来正在将上述对象调整为 UTC 时间。
但我的要求是,它应该以与对象中相同的格式存储,并且不应该调整到UTC时间。

我探索了here给出的方法,但没有一个方法满足我的要求。

有人可以建议是否有办法实现这一目标。任何帮助将不胜感激。

我使用并输入的代码是

startDateTime: 2023-07-25T12:40:46.143Z
"timeZoneOffset": "UTC-08:00"
。我正在根据 timezoneOffset 值将输入转换为预期的 OffsetDateTime。

 val actualDateTime: OffsetDateTime = OffsetDateTime.parse(startDateTime)
            val zoneOffset: ZoneOffset = ZoneOffset.of(timeZoneOffset.replace("UTC", ""))
            val expectedDateTime: OffsetDateTime = actualDateTime.withOffsetSameInstant(zoneOffset)
            return expectedDateTime.toString()

DDL:

CREATE TABLE IF NOT EXISTS TRANSACTION
(
    id                uuid                     DEFAULT,
    start_date_time   TIMESTAMP WITH TIME ZONE NOT NULL,
    end_date_time     TIMESTAMP WITH TIME ZONE NOT NULL,
    currency          VARCHAR(5)               NOT NULL,
    country           VARCHAR(50)              NOT NULL,
    created_at        TIMESTAMP WITH TIME ZONE NOT NULL,
    created_by        VARCHAR (255)            NOT NULL,
    startDateTime     TIMESTAMP WITH TIME ZONE NOT NULL
)
java postgresql kotlin datetime java-time
1个回答
1
投票

您的最佳实践是将时区视为表示属性,并将时间戳本身视为时间瞬间。如果您的业务需要要求您保留输入字段的时区,那么您必须将其存储在时间戳之外的另一个字段中。

postgresql 使用“timestamp with timezone”类型仅解释输入字符串的时区偏移量。数据库不保留该时区数据。时间戳始终存储为 UTC,时区立即丢失。

© www.soinside.com 2019 - 2024. All rights reserved.