最近埃及更改了DST规则,我对Postgres有一个问题,因为函数now()返回了错误的时区. 我的时区是Africa/Cairo,现在是+3:00,但Postgres返回+2:00

select now();

返回:

2023-05-05 22:17:06.461 +0200

应该是:

2023-05-05 23:17:06.461 +0300

My Postgres is containerized.
Time on the host: Fri May 5 23:19:26 EEST 2023 (correct).
Time in the Postgres container: Fri 05 May 2023 11:22:00 PM EEST (correct).

timezone在Postgres中的配置正确:

show timezone;  -- returns Africa/Cairo

‘非洲/ cairo ’的timezone表格条目为+3:00:

select * from pg_timezone_names
where name = 'Africa/Cairo';`

返回:

Africa/Cairo    EEST    03:00:00    true

Postgres版本:

PostgreSQL 15.2 (Debian 15.2-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit

我不知道为什么now()没有像预期的那样工作.

推荐答案

函数now()返回错误的时区.

严格地说,函数now()(也称为transaction_timestamp()CURRENT_TIMESTAMP)根本不"返回时区".从now()返回的timestamptz中的display由调用会话的当前timezone设置来管理-该设置继而遵循在IANA timezone database中制定的规则.

公平地说,埃及政府在相当短的时间内重新引入了DST.According to Wikipedia:

2023年3月1日,埃及内阁通过了2023年第24号法律, 恢复DST,从以下日期的最后一个星期五开始改为UTC+03:00 4月28日00:01至10月最后一个星期四(26日) 10月)23:59.

我感到困惑的是,有任何国家会恢复DST规则.世界应该尽快摆脱这种有害的废话!

Postgres要么使用自己的副本,要么(更常见的)使用底层操作系统的时区数据库,如果它是用选项--with-system-tzdata=DIRECTORY编译的.

在我的本地安装中就是这种情况.我用pg_config --configure英镑查到了.My Postgres 15.2已经使用选项--with-system-tzdata=/usr/share/zoneinfo进行了编译.

因为我的操作系统是最新的,从4月中旬开始更新到/usr/share/zoneinfo/Africa/Cairo,所以我安装的所有Postgres版本都是最新的.我得到了非洲/ cairo 的夏季时间,2023年的偏移量为+03:00(但不是2022年).

我可以在dbfiddle.uk上重现您的问题,它也不是最新的:

fiddle

(这一点随时可能改变.)

唯一令人费解的细节是,你会看到pg_timezone_names中的正确条目,就像我在当地做的那样,但与小提琴不同.(?)

Why does it not work for you?

我认为有三个可能的原因:

  • 您的Postgres版本不是用--with-system-tzdata=DIRECTORY编译的.Postgres 15.2于2023-02-09发布,目前还没有最新的IANA补丁.(我预计下一次的Point发布将包括更新.)

  • 你的Postgres版本是用--with-system-tzdata=DIRECTORY编译的, 但你没有安装操作系统更新(就像你应该的那样).

  • 由于您的集装箱化安装,翻译过程中会丢失一些内容.

相关:

Postgresql相关问答推荐

如何获取实例化视图的列级权限?

为什么32632投影中的几何图形并不完美?

我可以将jsonb_set与来自SELECT语句的新值(第三个参数)一起使用吗?

将具有自定义类型的表从一种模式复制到另一种模式

在 postgres/presto/AWS-Athena 中,与 array_agg( (col1, col2) ) 相反的是什么来获得每组多行?

JOOQ:数据库版本早于 COCKROACHDB 支持的方言:13.0.0

配置:错误:C 编译器无法在 Ubuntu 中创建可执行文件

Django + Postgres + 大时间序列

PostgreSQL:是否可以将枚举转换为整数?

如何使用 ActiveRecord json 字段类型

!= 和 <> 运算符有什么区别?

为什么 SQLAlchemy 不创建串行列?

在 Spring Boot 上使用 Hibernate 映射 PostGIS 几何点字段

psql:致命:connection requires a valid client certificate

如何禁用 postgresql缓存优化?

Postgresql - 更新规则 - 可能有一个最后修改日期,自动更新该行的on update?

Postgres Hstore 与 Redis - 性能方面

PostgreSQL 字符串(255) 限制 - Rails、Ruby 和 Heroku

查询 JSON 列中的数组元素

在 Select (PostgreSQL/pgAdmin) 中将布尔值返回为 TRUE 或 FALSE