postgresq timestamptz 转换为本地时间问题

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

我有如下两个环境

   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 转换为时间戳。

postgresql datetime timestamp timezone
1个回答
0
投票

确保在生产环境的数据库会话中参数

timezone
设置为
Asia/Kolkata
。您可以使用该设置启动 Java 虚拟机:

java -Duser.timezone=Asia/Kolkata ...

或在 PostgreSQL 连接 URI 中设置

timezone

jdbc:postgresql://localhost:5432/test?options=-ctimezone=Asia/Kolkata
© www.soinside.com 2019 - 2024. All rights reserved.