PostgreSQL中date_trunc截断前是否存在两次时区转换?
PostgreSQL中date_trunc处理timestamptz的时区行为验证
在PostgreSQL会话中设置了set timezone = 'Asia/Singapore'; -- UTC+8,执行语句:
select date_trunc('day','2021-02-16 20:00+04'::timestamptz);
返回结果为2021-02-17 00:00:00+08,日期从16日变为17日,这一结果超出预期。
我对该过程的理解是存在两次转换:
- 第一步:
2021-02-16 20:00+04先转换为UTC时间16:00+00,以PostgreSQL内部的微秒级纪元时间(8位整数)存储; - 第二步:执行
date_trunc时,会将上述UTC时间转换为会话时区(UTC+8)的时间,此时对应的本地时间是16日24点(即17日0点),因此函数按本地时间截断后得到2021-02-17 00:00:00+08。
为验证这一逻辑,我将输入改为2021-02-16 20:00+05执行测试,返回结果为2021-02-16 00:00:00+08(日期未递增)。推测原因是:该输入转换为UTC时间是15:00+00,对应会话时区(UTC+8)的本地时间为16日23点,未到次日0点,因此截断后仍为16日的午夜时间。
目前我仅找到一段相关的官方文档描述:
当输入值为timestamp with time zone类型时,截断操作会基于特定时区执行;例如,截断到天会生成该时区的午夜时间。默认情况下,截断基于当前TimeZone设置执行,但可通过可选的time_zone参数指定不同时区。
现希望验证我的理解是否正确,并获取更明确的官方解释依据。
内容的提问来源于stack exchange,提问作者Han Qi
相关产品推荐
相关产品推荐

