Postgres时区和格式

时间:2017-03-30 16:21:53

标签: postgresql timezone

我知道有一些类似的问题,但我很难理解为什么我的数据库格式化的时间是这样的。

我有一个名为created_at的字段,数据库中的值为:

2017-03-30 11:01:25.976-04

现在是纽约时间上午11点,与UTC相差四小时。

我希望它显示为上午11:01 。但是,当我使用TO_CHAR()对其进行格式化时,它会将时间转换为UTC并显示下午3:01

SELECT to_char(ledger.created_at, 'Mon DD YYYY HH12: MI AM') AS formatted_date ...

我可以通过添加AT TIME ZONE 'America/New_York'来解决这个问题,但我不喜欢在我的应用程序中硬编码的想法。

SELECT to_char(ledger.created_at AT TIME ZONE 'America/New_York', 'Mon DD YYYY HH12: MI AM') AS formatted_date ...

似乎时间戳字段知道它已经是什么时间,它处于什么时区(或者至少是偏移量),并且它在数据库本身上显示为11am。

我也知道我可以SET在每个查询之前的当地时间它会起作用,但我又想知道是否有更简单的方法。似乎我可以删除时区信息,只是获得数据库中的上午11:01 时间。如果没有办法,我可以忍受它,但我需要检查。

对于上下文,这是在使用Sequelize的Node和Express应用程序中。

2 个答案:

答案 0 :(得分:1)

PostgreSQL不存储时区,它将timestamp with time zone存储为UTC时间戳。

检索后,它将转换为数据库会话中有效的时区(使用SET TimeZone = '...'设置)。

因此,要将其转换为特定时区的字符串,有两种方法:

  • 使用SET TimeZone = '...'调整会话时区。

  • 使用AT TIME ZONE明确指定时区。

根据您的问题,我推断您的会话时区设置为UTC。

在某处指定所需的时区......

答案 1 :(得分:0)

我怀疑你遇到了服务器的configured TimeZone。如果是这种情况,并且您无法对其进行更改,那么最好的选择是使用SET TIME ZONE '...';

为当前会话设置 TimeZone