PostgreSQL AT TIME ZONE函数异常求助:时区结果不符
问题:PostgreSQL中Europe/Tirana时区转换结果不符合预期
运行以下查询时,误以为Europe/Tirana在2023-01-16的时区为CEST,预期结果均为2023-01-16 16:39:24.824000,但实际返回结果如下:
执行的SQL语句:
select '2023-01-16 14:39:24.824000 +00:00' at time zone 'Europe/Tirane'; select '2023-01-16 14:39:24.824000 +00:00' at time zone 'CEST';
实际返回结果:
2023-01-16 15:39:24.824000 2023-01-16 16:39:24.824000
可见Europe/Tirana未返回预期结果,已尝试使用::timestamptz等方法但结果未变,请问该异常行为的原因是什么?
原因分析
- 时区规则的时间范围差异
你的查询目标日期是2023-01-16,此时阿尔巴尼亚尚未启用永久夏令时(CEST):根据国际时区规则,阿尔巴尼亚是从2023年3月26日起才开始永久使用CEST(UTC+2),在此之前的冬季时段(包括2023年1月)仍遵循原冬令时规则,使用CET(UTC+1)。
输入的'2023-01-16 14:39:24.824000 +00:00'是UTC时间,转换到CET(UTC+1)自然得到2023-01-16 15:39:24.824000,这个结果是完全符合当时时区规则的正确输出,而非异常。
直接指定时区缩写的特殊性
第二个查询中直接使用CEST,它是夏令时的固定时区偏移(UTC+2),不会随日期切换冬夏令时,所以转换后得到你预期的16:39,但这和Europe/Tirana的实际时区规则并不等价——时区名称(如Europe/Tirana)会自动根据日期切换冬夏令时,而时区缩写(如CEST)是固定偏移。tzdata版本的潜在影响
如果你的PostgreSQL依赖的时区数据库(tzdata)版本过旧,可能无法识别阿尔巴尼亚2023年之后的永久时区变更规则,但你的查询日期在规则变更之前,所以这不是本次问题的直接原因。若后续查询2023年3月之后的日期仍出现异常,再考虑升级tzdata版本。
内容的提问来源于stack exchange,提问作者vshtishi
相关产品推荐
相关产品推荐

