如何在 flyway 创建的 postgresql jdbc 连接上设置时区?



我有一个 postgresql 数据库,我使用 flyway 将脚本部署到该数据库。我使用 maven flyway 插件针对目标数据库启动数据库构建。在该版本中,我有执行以下操作的脚本:

create table my_table(
my_date_time timestamp with time zone not null
);
insert into my_table(my_date_time)
select '2000-01-01';

postgresql 数据库时区设置为 UTC。我的客户端计算机(运行 maven/flyway 构建(正在运行 CEST (UTC+2:00(。

当脚本运行时,数据库将上面的字符串文本解释为 '1999-12-31 22:00:00+00:00',并将其写入存储。

似乎 flyway 创建的 jdbc 客户端连接没有将其客户端时区设置为 UTC,而是采用 timstamp 字符串并将其解释为"2000-01-01 00:00:00+02:00"。

如何将 flyway 创建的 jdbc 连接的客户端时区设置为 UTC?是否有可以放置在我的 flyway.conf 文件中的设置?

如果我将本地计算机时区更改为 UTC,问题就会消失,但我宁愿不在开发工作站上执行此操作。

一位同事提出了以下建议

mvn -Duser.timezone=UTC flyway:migrate

与其给它一个日期,postgres 必须解释,不如完全指定时间戳:

insert into my_table(my_date_time)
select '2000-01-01T00:00:00+00';

如果无法做到这一点,您可以尝试使用-Duser.timezone=UTC运行 mvn,但完全指定时间戳是更好的选择,因为它不会留下误解或错误配置的余地。

另一种方法是在迁移脚本本身中设置会话时区

SET timezone TO 'UTC';

我在脚本中使用 Flyway CLI。 因此,在执行 Flyway 命令之前将正确的时区设置为相应的环境变量对我有用:

export TZ=GMT

最新更新