从Postgres tstz字段获取原始时区。

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

我有一个这样的表。

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中做到这一点吗?

java-8 postgresql-9.5
1个回答
0
投票

你可以使用 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
© www.soinside.com 2019 - 2024. All rights reserved.