我有如下两个环境:
```
预生产环境 - Ubuntu,Postgres:12.18
生产环境 - Ubuntu,Postgres:12.18
```
我在这两个环境中都遇到了一个非常奇怪的问题。
在预生产环境中,
我的`timestamptz`值是:
```
2024-03-27 07:00:00.000 +0530
```
它具有UTC时区的绝对时间值。
在生产环境中我也有相同的值:
```
2024-03-27 07:00:00.000 +0530
```
但是在Java中渲染时,我看到两种不同的行为...一个是转换为印度标准时间(IST),另一个则没有转换为IST时区。
```
----------------------------------------------------
预生产环境 | 生产环境
----------------------------------------------------
2024-03-27 07:00:00.000 | 2024-03-27 12:30:00.000
----------------------------------------------------
```
根据下面的PostgreSQL文档:
```
对于带有时区的时间戳,内部存储的值总是在UTC(协调世界时,传统上称为格林尼治标准时间,GMT)。如果输入值指定了明确的时区,则使用该时区的适当偏移量将其转换为UTC。如果输入字符串中没有声明时区,则假定它在系统TimeZone参数指示的时区中,并使用时区区域的偏移量将其转换为UTC。
```
我看到PostgreSQL在将本地时间戳存储到数据库时,并没有将其转换为UTC,`2024-03-27 07:00:00.000 +0530`应该转换为UTC,并且在读取时应该转换回我已在PostgreSQL中设置为本地时间的IST时区。
```
Asia/kolkata
```
所以在预生产环境中,它给了我绝对值`2024-03-27 07:00:00.000`,这实际上是符合我要求的正确行为,所以它没有转换为UTC,并且在读取时给了我正确的值,而没有UTC转换,但根据上述文档,如果它被转换了,它应该转换为IST时区,如果它被转换了,那么它会产生错误的时区,将是`2024-03-27 12:30:00.000`。
那么Postgres的正确行为是什么,看起来Postgres的行为不同,所以我正在考虑由于这个问题将timestamptz转换为timestamp。
编辑:
我在Ubuntu中将时区设置为`Asia/kolkata`,并且同样的配置也在我的docker-compose中,所以PostgreSQL和Java服务都有IST时区。
```
我的docker-compose.yml.
java-service:
image: prod:latest
container_name: java-prod
ports:
- 8080:8080
build:
context: .
dockerfile: /Dockerfile
depends_on:
- prod_db
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
restart: always
prod_db:
image: 'postgres:12.18-alpine'
container_name: prod_db
ports:
- 5433:5432
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- ./postgres:/var/lib/postgresql/data:rw
root@srv529197:/opt/mas/prod# docker exec -it prod_db sh
/ # date
Thu May 23 16:55:38 IST 2024
/ #
```
1 个回答