如何在PostgreSQL中返回不同时区的当前日期

14
我正在开发一个应用程序,该应用程序使用东部时间,而数据库设置为太平洋时间。这已经导致了一些问题,但我们被告知不能有其他的方式,因此我们只能绕过它。
无论如何,我遇到的一个问题是获取今天的日期。由于数据库在太平洋时间,如果我在凌晨1点使用 current_date 来询问今天的日期,它会给我昨天的日期。我尝试设置时区和添加/减去间隔,但它似乎从未按照我的期望工作,并且我不想在凌晨1点进行广泛的测试来使其正常工作。
在PostgreSQL中,是否有一种相对简单的方式以给定的时区返回今天的日期?
2个回答

20

选择当前日期在时区 'UTC',current_date :: timestamp; 或任何其他区域

enter image description here

更新:

选择(current_date at time zone 'UTC')::date,current_date::date

enter image description here


12
在使用Postgres 9.6.5时,这个答案给了我错误的结果。 当我写这篇文章时,是2017-09-29T05:00Z(我的Postgres时区为UTC + 10),但是“select(current_date at time zone' UTC'):: date”却显示“2017-09-28”。相比之下,“select(current_timestamp at time zone' UTC'):: date”现在正确地给出了UTC日期“2017-09-29”。 - Simon Kissane
我相信这实际上是将当前日期(在数据库时区)转换为给定时区,而不是该时区中的当前日期。 - David Beck
2
'at time zone ..' 首先将日期从 current_date 转换为日期+时间戳;将时间设置为 00:00。然后,它会添加时区偏移量。如果伦敦是2/2下午4点,而您使用 'Australia/Sydney' 进行转换,您仍将得到2/2(因为它将是2/2 00:00 + 11 = 2/2上午11点)。相反,您应该使用 current_timestamp,如 @SimonKissane 建议的那样。 - hraban
有没有一种方式可以指定“太平洋标准时间(Pacific)”并让数据库自动判断它应该是标准时间还是夏令时? - MrChadMWood

15
SELECT date(timezone('EST', now()))

将返回当前日期,无论数据库时区是什么,都会以东部标准时间表示。

(或任何其他时区,但不支持偏移量,原因不明...)

SELECT date(timezone('UTC±XX', now()::timestamp))

如果您想使用偏移量,那么这仅适用于UTC偏移...


以上代码无法使用UTC偏移量的原因是因为PostgreSQL假定给定的值是一个POSIX时间戳,它本质上与UTC偏移量相同,但具有相反的符号和完全任意的字母组合。 - memeko
1
回到这篇文章,我意识到上面的评论可能有点不太清楚。我的意思是第一个代码片段也可以使用UTC偏移量,但是您需要反转符号以将其转换为POSIX时间戳。例如,要获取UTC + X中的当前时间,您需要编写UTC-X - memeko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接