【问题标题】:How to set timezone on postgresql jdbc connection created by flyway?如何在flyway创建的postgresql jdbc连接上设置时区?
【发布时间】:2020-02-05 16:03:57
【问题描述】:

我有一个 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,问题就会消失,但我不想在我的开发工作站上这样做。

【问题讨论】:

    标签: postgresql jdbc flyway


    【解决方案1】:

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

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

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

    【讨论】:

    • 我很想这样做,但是迁移已经应用到目标数据库并且更改它们会导致 flyway 抛出错误。当它们运行时,它们在设置为 UTC 的服务器上运行。此外,使用 -Duser.timezone=UTC 运行 mvn 会显示相同的问题。
    • 好的,所以它们已经被错误地存储了。您可以创建另一个迁移来更正它们。
    • 对不起,我不清楚。迁移已应用于 test/stage/prod 环境,但未应用于运行集成测试的本地环境。我考虑只在我的本地环境中添加一个迁移后步骤,但它并不完全明确我需要更新哪些记录,我宁愿首先让它应用正确的时区。
    【解决方案2】:

    一位同事提出以下建议

    mvn -Duser.timezone=UTC flyway:migrate
    

    【讨论】:

      【解决方案3】:

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

      SET timezone TO 'UTC';

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-16
        • 2021-03-20
        • 2018-05-31
        • 2015-09-15
        • 1970-01-01
        相关资源
        最近更新 更多