如何将当地时间转换为UTC?

时间:2013-08-12 13:24:28

标签: postgresql

我需要使用函数将本地时间转换为UTC。我的输入是当地时间,当地时间的时区(例如'太平洋/奥克兰')。我需要从程序中获得的是基于给定时区的当地时间的UTC时间。

有人可以帮忙吗?

我使用的是版本8.3

1 个答案:

答案 0 :(得分:21)

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

不幸的是,由于(IMO疯狂)SQL规范为AT TIME ZONE定义了TIME,你不能对TIME做同样的事情。您必须改为操纵TimeZone变量:

SET TimeZone = 'UTC';
SELECT TIME '07:00' AT TIME ZONE 'Australia/Sydney';

这仍然会让您timetz而不是time。因此,其显示值会随timezone设置而变化。