我知道有一些类似的问题,但我很难理解为什么我的数据库格式化的时间是这样的。
我有一个名为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应用程序中。
答案 0 :(得分:1)
PostgreSQL不存储时区,它将timestamp with time zone
存储为UTC时间戳。
检索后,它将转换为数据库会话中有效的时区(使用SET
设置)。TimeZone
= '...'
因此,要将其转换为特定时区的字符串,有两种方法:
使用SET TimeZone = '...'
调整会话时区。
使用AT TIME ZONE
明确指定时区。
根据您的问题,我推断您的会话时区设置为UTC。
您 在某处指定所需的时区......
答案 1 :(得分:0)
我怀疑你遇到了服务器的configured TimeZone。如果是这种情况,并且您无法对其进行更改,那么最好的选择是使用SET TIME ZONE '...';