【问题标题】:Get the original Timezone from Postgres tstz field从 Postgres tstz 字段获取原始时区
【发布时间】:2020-08-18 10:16:36
【问题描述】:

我有一张这样的桌子。

CREATE TABLE tstz (
    ts timestamp NULL,
    tstz timestamptz NULL,
    seq text NULL
);

每当我存储带有时区的时间戳时,它都会转换为数据库的时区。如何取回检索时使用的原始时区?

例如,我将像 2020-04-29T08:06:03.424689+05:30 这样的时区存储到数据库中。但是,当我使用 Java 读取数据库并再次读取时区时,如下所示。

 Optional<Tstz> tstzOptionalSaved =  tstzRepository.findById(tstz.getSeq());
        Tstz tstzSaved = tstzOptionalSaved.get();
        log.info("Timezone  {}" , tstzSaved.getTstz().getZone().getId());

上面的代码总是返回 UTC,它是数据库的时区。

有没有办法在 Postgres 或 Java 中做到这一点?

【问题讨论】:

  • 原始时区未存储在该值中
  • @a_horse_with_no_name 我们没有办法做到这一点?
  • 您无法检索未存储的信息
  • 您使用什么数据类型来映射您的域类Tstz 中的列?

标签: java-8 postgresql-9.5


【解决方案1】:

您可以使用OffsetDateTime。来自postgresql docs

所有 OffsetDateTime 实例都必须采用 UTC(偏移量为 0)。这是因为后端将它们存储为 UTC。

所以你需要为偏移量添加一列,然后使用偏移量获取原始值,

OffsetDateTime tstz = rs.getObject("tstz", OffsetDateTime.class);
OffsetDateTime odtOriginal = tstz
        .toInstant()
        .atOffset(ZoneOffset.ofTotalSeconds(rs.getInt("tstz_offset")));
// 2020-04-29T08:06:03.424689+05:30

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 2020-11-14
    • 2013-10-04
    相关资源
    最近更新 更多