将 postgresql 中的 UTC 时区转换为 EST(本地时间)

Posted

技术标签:

【中文标题】将 postgresql 中的 UTC 时区转换为 EST(本地时间)【英文标题】:Convert a UTC timezone in postgresql to EST (local time) 【发布时间】:2016-07-20 08:36:54 【问题描述】:

我是 PostgreSQL 新手,我想知道是否有直接的方法可以使用函数将表中的时间戳值转换为不同的时区。在我的情况下,它是 UTC 到 EST。

例如,这些是我需要转换为 EST 的值(不仅仅是一个值,而是表中的所有值)

date
-------------------
2015-10-24 16:38:46
2016-01-19 18:27:00
2016-01-24 16:14:34
2016-02-09 23:05:49
2016-02-11 20:46:26

【问题讨论】:

旁注:您可能希望使用'America/New_York'(来自IANA time zone database)作为您的时区,而不是'EST'。三个字母的缩写是不精确的(你真的是指 UTC-0400,还是在夏天想要 UTC-0300?)并且经常在多个国家甚至一个国家重复(阿拉斯加和波多黎各的时区通常是都标有“AST”) 【参考方案1】:

在伦敦,我们目前比世界标准时间早 1 小时。所以 - 如果我使用没有时间戳的时区并说它是 UTC,我会为我的本地时区打印它。

richardh=> SELECT ((timestamp '2015-10-24 16:38:46') AT TIME ZONE 'UTC');
        timezone        
------------------------
 2015-10-24 17:38:46+01
(1 row)

但是从返回的值来看,您想要的“EST”似乎位于美洲的某个地方。如果您愿意,可以将表达式包装在一个小 SQL 函数中。

richardh=> SELECT ((timestamp '2015-10-24 16:38:46') AT TIME ZONE 'UTC') AT TIME ZONE 'EST';
      timezone       
---------------------
 2015-10-24 11:38:46
(1 row)

编辑:如何在查询中做到这一点

SELECT ((stored_timestamp AT TIME ZONE 'UTC') AT TIME ZONE 'EST') AS local_timestamp
FROM my_table;

如果这类事情给您带来问题,您可能会想要一本关于 SQL 的介绍性书籍。

【讨论】:

非常感谢。但是,这个函数只是用于自定义时间戳值,对吧?如果我需要更改表中的所有行,而不仅仅是一个值,我该怎么做? 根据您的回答,这应该给我当地时间:select now() AT time zone 'IST';但事实并非如此。【参考方案2】:

同样 执行

SELECT '2015-10-24 16:38:46'::timestamp AT time zone 'EST';

timezone
------------------------
 2015-10-24 21:38:46+00
(1 row)

【讨论】:

这是否需要将您的数据库设置为默认采用 UTC? benjimin 是的。因为当 Postgres 运行此命令时,它会将时间戳值转换为 EST,然后显示在您设置的时区中。类似于@Richard Huxton 回答的第一部分。他们将时间戳转换为“UTC”,但显示为 +01。 根据您的回答,这应该给我当地时间:select now() AT time zone 'IST';但事实并非如此。【参考方案3】:

我通常将所有内容都保留为 UTC,并在需要显示时进行转换。 我使用类似的东西:

SELECT my_date_utc AT time zone 'utc' at time zone 'est' From ....

【讨论】:

【参考方案4】:

如果您在访问您的区域时遇到问题,您也可以简单地传递您的区域间隔。 将时间戳从 IST 转换为 UTC。

SELECT '2020-12-14 06:38:46'::timestamp AT time zone INTERVAL '+05:30';

timezone
------------------------
2015-10-24 11:38:46+00
(1 row)

将时间戳从 UTC 转换为 IST。

SELECT '2020-12-14 06:38:46'::timestamp AT time zone INTERVAL '-05:30';

timezone
------------------------
2020-12-14 12:08:46+00
(1 row)

【讨论】:

【参考方案5】:

您应该始终以 UTC 格式存储日期的主要引用,并在查询中将其转换为时区,或者将数据的特定时区版本存储在另一列中。这样做的原因是,只要您知道它存储为 UTC 的时区,就可以快速轻松地将日期从 UTC 转换为另一个时区。它消除了猜测工作。或者,您可以将日期与时区一起存储。

如果您的操作会使用服务器的系统时钟自动填充日期,那么您可以 A:更改操作以使用UTC时间 B: 将服务器上的系统时钟改为UTC

【讨论】:

【参考方案6】:

我遇到了同样的问题,我正在处理不同的地区和时区,我只需要修复查询中的时区,它不会影响该地区的其他客户,而且我没有更改表结构或任何东西(开闭原则)。我在查询中做了什么: SELECT TO_CHAR(current_timestamp at time zone 'Australia/Melbourne', 'DD/MM/YYYY hh24:mi AM') as date_of_extract 这对我有用,我可以将我的 postgressql 的“UTC”默认时区更改为“澳大利亚/墨尔本”(您正在查看的任何时区)。希望这会有所帮助。

【讨论】:

以上是关于将 postgresql 中的 UTC 时区转换为 EST(本地时间)的主要内容,如果未能解决你的问题,请参考以下文章

将 UTC 中的 SQL Server 日期时间转换为特定时区

将UTC时间戳转换为熊猫中的本地时区问题

PostgreSQL中的时区转换不一致[重复]

如何根据 bigquery 中的时区列将 UTC 时间转换为本地时区?

Redshift - 将 UTC 数据转换为其他时区

带有时区的 PostgreSQL date()