【发布时间】:2013-08-13 19:59:38
【问题描述】:
我需要使用函数将本地时间转换为 UTC。我的输入是当地时间,当地时间的时区(例如“太平洋/奥克兰”)。我需要从程序中得到的是基于给定时区的当地时间的 UTC 时间。
有人可以帮忙吗?
我使用的是 8.3 版
【问题讨论】:
标签: postgresql
我需要使用函数将本地时间转换为 UTC。我的输入是当地时间,当地时间的时区(例如“太平洋/奥克兰”)。我需要从程序中得到的是基于给定时区的当地时间的 UTC 时间。
有人可以帮忙吗?
我使用的是 8.3 版
【问题讨论】:
标签: postgresql
manual 对此进行了介绍,但如何实际处理日期/时间并不总是很明显。 SQL 规范有点奇怪。
对于您的问题,不清楚您是要以 UTC 格式存储时间但以服务器的本地时间 (TimeZone) 显示它,还是要忽略 TimeZone 并始终显示它作为UTC。我假设是后者。
对于时间戳,您只需使用两次AT TIME ZONE,例如:
SELECT TIMESTAMP '2013-08-13 00:00:00' AT TIME ZONE 'Australia/Sydney' AT TIME ZONE 'UTC';
您需要使用两次AT TIME ZONE。一次根据参数时区将输入 timestamp 转换为 timestamptz,然后在 UTC 将其转换为 timestamp。
不幸的是,由于 SQL 规范为 TIME 定义 AT TIME ZONE 的(IMO 疯狂)方式,您不能为 TIME 做同样的事情。您将不得不操作 TimeZone 变量:
SET TimeZone = 'UTC';
SELECT TIME '07:00' AT TIME ZONE 'Australia/Sydney';
这仍然会给您留下timetz 而不是time。所以它的显示值随着timezone的设置而变化。
【讨论】: