当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL从不带时区的时间戳转换为带时区的时间戳错误

耿炎彬
2023-03-14
select '2011-12-30 00:30:00'::timestamp without time zone AT TIME ZONE 'EST5EDT';

返回2011-12-30 05:30:00+00女巫是错误的。

但接下来的查询如下:

select '2011-12-30 00:30:00'::timestamp without time zone AT TIME ZONE 'UTC-5';
select '2011-12-30 00:30:00' AT TIME ZONE 'EST5EDT';

我看对日期2011-12-29 19:30:00

SELECT  current_setting('TIMEZONE');
current_setting
-----------------
     UTC
(1 row)

共有1个答案

程振濂
2023-03-14

timestamp在时区中没有时区timestamp重新解释为在该时区中,以便将其转换为UTC。

TimeStamp with time zoneTimeStamptz转换为指定时区的TimeStampt

PostgreSQL使用ISO-8601时区,它指定格林威治以东为正值……除非您使用POSIX时区说明符,在这种情况下,它遵循POSIX。精神错乱随之而来。

select '2011-12-30 00:30:00'::timestamp without time zone AT TIME ZONE 'EST5EDT';

此时间戳调整为UTC存储,然后根据服务器timezone的显示设置进行调整,以便以本地时间显示。

相反,如果您希望说“我有UTC时间的时间戳,并希望查看EST5EDT中等效的本地时间是多少”,如果您希望独立于服务器时区设置,则需要编写如下内容:

select TIMESTAMP '2011-12-30 00:30:00' AT TIME ZONE 'UTC'
       AT TIME ZONE 'EST5EDT';

这是“给定时间戳2011-12-3000:30:00,在转换为timestamptz时,将其视为UTC中的时间戳,然后将该timestamptz转换为EST5EDT中的本地时间”。

很可怕,不是吗?我想给那些决定在时区使用疯狂语义的人一个坚定的谈话--它实际上应该是类似于timestamp从时区'-5'转换为时区'+5'timestamptz转换为时区'+5'。此外,带有时区的时间戳实际上应该携带它的时区,而不是存储在UTC中并自动转换为LocalTime。

你最初的“作品”版本:

select '2011-12-30 00:30:00' AT TIME ZONE 'EST5EDT';

只有当TimeZone设置为UTC时才是正确的,因为当没有指定text-to-timestamptz时,将假定TimeZone为TimeZone。

另一个似乎有效的版本是独立于时区的,但它只是因为两个问题抵消了自己而有效。首先,如上所述,timestamp没有时区在时区将时间戳重新解释为在该时区中,以便转换为UTC时间戳;这有效地减去了时区偏移量。

然而,出于我无法理解的原因,PostgreSQL使用的时间戳与我习惯看到的大多数地方的时间戳相反。请参阅文档:

另一个需要记住的问题是,在POSIX时区名称中,正偏移量用于格林威治以西的位置。在其他地方,PostgreSQL遵循ISO-8601的约定,即正时区偏移位于格林威治以东。

select TIMESTAMP '2011-12-30 00:30:00' AT TIME ZONE 'UTC'
       AT TIME ZONE '+5';
 类似资料:
  • 这是我在申请表中得到的日期: 将psqlDate转换为joda的最佳方式是什么? [编辑] 我可以使用解析方法。它可以很好地使用时间戳,它可以使用T-分割日期和时间的信息。 这应该与良好的模式一起工作: 带有时区的PostgreSQL时间戳的正确模式是什么?

  • 我正在尝试将日期插入我的PostgreSQL数据库。以下是我在java应用程序中解析日期的方式: 在我的PostgreSQL数据库中。我将其作为带有时区的。处理和插入它的理想方式是什么? 数据库期望的示例。

  • 问题内容: 我正在尝试创建以下视图: 它给了我以下错误: 您的查询具有以下错误:不支持的配置单元类型:带有时区的时间戳 但是,当我自己运行查询时,它可以正常工作,并且在这里提到From_iso8601_timestamp作为有效的日期函数。 谁能告诉我我在做什么错? 问题答案: 不幸的是,雅典娜并不完全支持Presto的所有功能,它具有局限性,并且在技术上比Presto落后几个版本。有一些尝试使A

  • 我想将时间戳转换为。 这是我到目前为止已经实现的,但是它给了我错误的月份 任何帮助将不胜感激。

  • 问题内容: 我想将一列数据从文本更改为时间戳类型。我的数据中没有时区。我的数据格式类似于28-03-17 17:22,包括时间和日期,但没有时区。换句话说,我所有的数据都在同一时区。我该怎么做? 我在下面尝试了多种方法,但仍然找不到正确的方法。希望您能够帮助我。 当然,如果可以解决我的问题,我可以建立一个新表。 问题答案: 如果TEXT类型的文本具有有效的日期值,则按以下步骤进行更改会更容易(建议

  • 问题内容: 我正在使用MongoDB来存储我的数据。Mongo默认将时间戳存储在UTC中。我们在不同时区处理数据。我正在努力将UTC时间戳转换为PDT或IST时间戳。 试图构造一种方法来传递时区(将我的时间戳转换为时区)和timestamp(UTC)。返回指定时区的时间戳的方法。 问题答案: 您可以使用带有所需时区的dateformat并将其应用于日期