我有一个这样的表。
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中做到这一点吗?
你可以使用 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