我有如下两个环境
pre_prod - ubuntu , postgres:12.18
prod - ubuntu, postgres:12.18
我在这两种环境中都面临着非常特殊的问题。
在 pre_prod 中。
我的时间戳值是`
2024-03-27 07:00:00.000 +0530
其时间戳绝对值为 utc 时区。
在产品中我确实具有相同的价值..
2024-03-27 07:00:00.000 +0530
但是在java中渲染时,我看到两种不同的行为..一个正在转换为IST,另一个没有转换为IST时区..
----------------------------------------------------
pre_prod | prod
----------------------------------------------------
2024-03-27 07:00:00.000 | 2024-03-27 12:30:00.000
----------------------------------------------------
根据下面的 postgresql 文档
对于带时区的时间戳,内部存储的值始终位于 UTC(通用协调时间,传统上称为格林威治标准时间) 时间,格林威治标准时间)。指定了显式时区的输入值是 使用该时区的适当偏移量转换为 UTC。如果 输入字符串中没有指定时区,则假定为 在系统的TimeZone参数指示的时区中,并且是 使用时区偏移量转换为 UTC。
我看到,postgres 没有将我的本地时间戳转换为 utc,同时将其存储在数据库中,
2024-03-27 07:00:00.000 +0530
应该转换为 utc,并且在读取时应该转换回 IST 时区,我已将其设置为 postgres 中的本地时间.
亚洲/加尔各答
所以在 preprod env 中,它给我的绝对值是
2024-03-27 07:00:00.000
,这实际上是根据我的要求的正确行为,因此它没有转换为 utc,在读取时它给了我正确的值,没有 utc 转换,但如上所述文档,它应该转换为 IST 时区,如果转换,则会产生错误的时区,这将是 2024-03-27 12:30:00.000
。
那么 posgres 的正确行为是什么,似乎 postgres 的行为不同,所以由于这个问题,我正在考虑将 timestamptz 转换为时间戳。
确保在生产环境的数据库会话中参数
timezone
设置为 Asia/Kolkata
。您可以使用该设置启动 Java 虚拟机:
java -Duser.timezone=Asia/Kolkata ...
或在 PostgreSQL 连接 URI 中设置
timezone
:
jdbc:postgresql://localhost:5432/test?options=-ctimezone=Asia/Kolkata