我知道有一些类似的问题,但我很难理解为什么我的数据库按现在的方式格式化。
我有一个名为 created_at
的字段,在数据库中的值为:
2017-03-30 11:01:25.976-04
现在是纽约时间上午 11 点,与 UTC 有四个小时的负偏移。
我希望它显示为11:01am。但是,当我使用 TO_CHAR()
对其进行格式化时,它会将时间转换为 UTC 并显示 3:01pm。
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 ...
时间戳字段似乎知道现在是什么时间,以及它所在的时区(或者至少是偏移量),并且它在数据库本身中显示上午 11 点。
我也知道我可以在每次查询之前SET
本地时间并且它会起作用,但我再次想知道是否有更简单的方法。看起来也许我可以去掉时区信息并只获取数据库中的11:01am时间。如果没有办法,我可以接受,但我需要检查一下。
就上下文而言,这是在使用 Sequelize 的 Node 和 Express 应用程序中。
最佳答案
PostgreSQL不存储时区,它存储timestamp with time zone
作为 UTC 时间戳。
检索后,它会转换为数据库 session 中有效的时区(使用 SET <a href="https://www.postgresql.org/docs/current/static/runtime-config-client.html#GUC-TIMEZONE" rel="noreferrer noopener nofollow"><code>TimeZone</code></a> = '...'
设置)。
那么要将其转换为某个时区的字符串,有两种方法:
使用
SET TimeZone = '...'
调整 session 时区.使用
AT TIME ZONE
显式指定时区.
根据您的问题,我推断您的 session 时区设置为 UTC。
您必须在某处指定所需的时区...
关于postgresql - Postgres 时区和格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43123327/