为什么Postgres中'UTC-4'时区对应+04、'UTC+4'对应-04?
Postgres UTC±X时区符号反转原因说明
核心原因
出现符号相反的问题是因为Postgres兼容POSIX时区命名规范,该规范的偏移符号定义和我们日常使用的ISO 8601标准完全相反:
- 日常直觉/ISO 8601规则:
UTC±X的偏移表示 UTC时间加偏移等于本地时间,比如UTC+4对应本地时间=UTC+4小时 - POSIX时区规则:
UTC±X的偏移表示 本地时间加偏移等于UTC时间,对应计算逻辑刚好反转:- 写
UTC+4时区时:本地时间 + 4小时 = UTC → 本地时间=UTC-4小时,对应直觉里的UTC-4偏移 - 写
UTC-4时区时:本地时间 -4小时 = UTC → 本地时间=UTC+4小时,对应直觉里的UTC+4偏移
- 写
你的查询结果也刚好验证了这个规则:
避免混淆的写法
如果不想被符号规则绕晕,可以用两种无歧义的写法指定时区:
- 直接写ISO格式的偏移值,不需要加UTC前缀:
-- 对应直觉里的UTC+4偏移 SELECT now() AT TIME ZONE '+04'; -- 对应直觉里的UTC-4偏移 SELECT now() AT TIME ZONE '-04';
- 使用城市级时区名,完全规避符号问题:
-- 迪拜时区,固定为UTC+4偏移 SELECT now() AT TIME ZONE 'Asia/Dubai'; -- 纽约时区,夏令时会自动调整偏移 SELECT now() AT TIME ZONE 'America/New_York';
内容的提问来源于stack exchange,提问作者nghihua
相关产品推荐
相关产品推荐

