PostgreSQL中如何将IANA时区格式转换为整数形式
在PostgreSQL中将IANA时区转换为偏移值(含夏令时)
完全可行,PostgreSQL内置了系统视图和函数可以直接实现这个需求。你要的-4/5对应America/New_York时区的夏令时(EDT,-4小时)和标准时间(EST,-5小时)偏移,以下是具体实现方法:
方法一:获取时区的标准/夏令时双偏移
利用PostgreSQL自带的pg_timezone_names系统视图,它包含了所有IANA时区的偏移信息,直接查询即可得到两种偏移的拼接结果:
-- 整合你的初始查询逻辑 SELECT CONCAT( FLOOR(EXTRACT(HOUR FROM dst_offset)), '/', FLOOR(EXTRACT(HOUR FROM utc_offset)) ) AS tz_offset FROM pg_timezone_names WHERE name = (SELECT settings.time_zone FROM time_zone WHERE id = 1);
代码说明:
pg_timezone_names.name:匹配你存储的IANA时区文本值(如America/New_York)utc_offset:时区的标准时间偏移(America/New_York对应-05:00)dst_offset:时区夏令时生效时的偏移(America/New_York对应-04:00)EXTRACT(HOUR FROM ...):提取偏移的小时部分,FLOOR用于取整(忽略分钟级偏移)CONCAT:将两个偏移拼接成你需要的-4/-5格式
方法二:获取当前时间对应的实时偏移
如果你只需要当前时刻该时区的偏移(而非双偏移),可以用以下语句:
SELECT FLOOR(EXTRACT(HOUR FROM CURRENT_TIMESTAMP AT TIME ZONE (SELECT settings.time_zone FROM time_zone WHERE id = 1) AT TIME ZONE 'UTC' - CURRENT_TIMESTAMP )) AS current_tz_offset;
注意事项:
- 部分时区没有夏令时机制,此时
dst_offset和utc_offset值相同,结果会呈现如1/1的形式,符合实际情况 - 确保你的PostgreSQL版本支持
pg_timezone_names视图(PostgreSQL 9.1及以上版本均支持)
内容的提问来源于stack exchange,提问作者Silny ToJa
相关产品推荐
相关产品推荐

