【问题标题】:Postgres time zones and formattingPostgres 时区和格式
【发布时间】:2017-03-30 16:21:52
【问题描述】:

我知道对此有一些类似的问题,但我很难理解为什么我的数据库会以这种方式格式化时间。

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


    【解决方案1】:

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

    在检索时将其转换为数据库会话中有效的时区(使用SET @987654321@ = '...' 设置)。

    所以要将其转换为某个时区的字符串,有两种方法:

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

    • AT TIME ZONE明确指定时区。

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

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

    【讨论】:

    • 谢谢。为了确保我理解,当您说“时区配置参数”时,您是在谈论在某个配置文件中的多个会话中全局设置的东西吗?还是您指的是使用 SET TimeZone ?感谢您的耐心等待。
    【解决方案2】:

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

    为当前会话设置 TimeZone

    【讨论】:

    • 谢谢。我试图从文档中弄清楚:这是在 postgresql.conf 中设置的还是继承了我的服务器设置的任何内容?
    • 我相信顺序是:继承服务器时区,在 postgresql.conf 中定义的值,SET SESSION TIME ZONE ...,最后是SET LOCAL TIME ZONE ...。这意味着如果您不指定LOCAL TIME ZONE,它将查找`SESSION TIME ZONE. If neither of those have been defined, it will fall back to the value defined in postgresql.conf`。如果那里没有定义值,它将使用您的服务器时区。
    猜你喜欢
    • 2016-02-05
    • 2015-11-19
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2016-04-30
    • 2019-07-06
    • 1970-01-01
    相关资源
    最近更新 更多