postgresql - Postgres 时区和格式

标签 postgresql timezone

我知道有一些类似的问题,但我很难理解为什么我的数据库按现在的方式格式化。

我有一个名为 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/

相关文章:

sql - 加入两个没有关系的表 postgres?

php - 如何使用 Laravel Eloquent 地避免 "duplicate key value violates unique constraint"?

php - 使用 Laravel 上传和显示保存在 PostgreSQL 中的 PDF 文件

node.js - 默认时区不适用于 postgres 中的 sequelize 查询

angular - 将数据导出到 excel 时,日期会根据时区发生变化。如何避免?

windows - 在 MSYS 中更改时区

java - 如何根据用户时区更改时区

sql - 如何在 PostgreSQL 中获取两个日期之间的月份数值?

php - 在 PHP 中显示来自 PostgreSQL 数据库的图像

ruby - 如何确定 Ruby 中给定城市、州的时区(EST、PST、MST、CST、AKST、HST)?