PostgreSQL服务器UTC时区下,查询返回带偏移的其他时区日期问题
解决PostgreSQL时区偏移获取问题
我懂你的需求:服务器跑在UTC时区,你想查询其他时区的日期,同时拿到对应的时区偏移值,不用每次切换会话时区。下面给你几个实用的方案:
1. 直接返回带时区偏移的格式化时间串
如果你想一次性得到指定时区的时间+偏移的完整字符串,用TO_CHAR函数配合时区格式符就搞定:
-- 获取欧洲巴黎时区的当前时间,带偏移(比如 +02:00) SELECT TO_CHAR(now(), 'YYYY-MM-DD HH24:MI:SS.US TZHTZM') AS paris_time_with_offset;
这个查询会返回类似2018-04-20 16:58:22.680380 +02:00的结果,TZHTZM格式符会输出带冒号的标准时区偏移格式。
2. 单独提取时区偏移数值(秒/小时)
要是你只需要偏移的数值,用EXTRACT函数就能拿到:
-- 获取巴黎时区相对于UTC的偏移秒数 SELECT EXTRACT(TIMEZONE FROM now() AT TIME ZONE 'Europe/Paris') AS offset_seconds; -- 转换成更直观的小时数 SELECT EXTRACT(TIMEZONE FROM now() AT TIME ZONE 'Europe/Paris') / 3600 AS offset_hours;
对巴黎时区来说,结果会是7200(秒)或者2(小时),而且PostgreSQL会自动处理夏令时的偏移变化哦。
3. 不切换会话时区,直接查指定时区的带偏移时间
如果你想得到带时区信息的timestamptz类型结果,同时保留偏移显示,可以这么写:
-- 将当前UTC时间转换为巴黎时区的带时区时间 SELECT now() AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Paris' AS paris_time;
这里第一个AT TIME ZONE 'UTC'把timestamptz转成UTC的timestamp,第二个AT TIME ZONE 'Europe/Paris'再转成巴黎时区的timestamptz,输出时会自动带上对应的偏移。
小补充
你之前用SET timezone to 'Europe/Paris'只是改了当前会话的时区,now()返回的timestamptz本质还是存的UTC时间,只是显示时转成了会话时区并带偏移。上面的方法可以让你不用切换会话,直接在查询里灵活处理任意时区的时间和偏移。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

