【问题标题】:Timestamp with timezone error in postgresql prior to 18921892 年之前的 postgresql 中时区错误的时间戳
【发布时间】:2019-05-30 06:38:54
【问题描述】:

我想在 1892 年之前在 PostgreSQL 数据库中添加一个“带时区的时间戳”,但是当我尝试它时,我得到一个像“1892-05-01 11:59:59+00:17:30”这样的时间戳不是常规时区。

我尝试了一些值,但似乎问题发生在 1892/05/01 (UTC+0) 11:42 之前的所有值,之后则没有。

SELECT '1892-05-03T03:00:00+01:00'::timestamp with time zone;

这给了我1892-05-03 02:00:00+00,这是预期的。

SELECT '1892-04-15T03:00:00+01:00'::timestamp with time zone;

这给了我1892-04-15 02:17:30+00:17:30 这是错误的。

我读到这可能是由于 PostgreSQL 处理时区的原因,但是是否可以在不删除列的时区参数的情况下解决它?

【问题讨论】:

    标签: postgresql timestamp postgresql-9.5 timestamp-with-timezone


    【解决方案1】:

    我进行了选择并返回了预期的结果。 见下文:

    postgres=# SELECT '1892-04-15T03:00:00+01:00'::timestamp with time zone;

    时间戳

    1892-04-15 02:00:00+00 (1 行)

    我用的是最新版本,你的PostgreSql是什么版本的?

    【讨论】:

    • 我在 debian stable 上安装 9.5 得到了相同的结果。我怀疑是旧时区设置文件或类似文件。在 1900 年之前事情变得有点模糊,因为当时时区并不普遍,所以这可能是最近的调整/更正。
    • 在 Windows 10 上使用 9.5 安装,我得到 1892-04-15 02:17:30+00:17:30 作为时间戳,但奇怪的是它在不同版本的 PostgreSQL 上会有所不同。
    【解决方案2】:

    1892-04-15 02:17:30+00:17:30 没有错误。所有这些timestamptz 文字都代表完全相同的时间点:

    1892-05-03 03:00:00+01:00
    1892-05-03 02:17:30+00:17:30
    1892-05-03 02:00:00+00
    

    见:

    混乱的根源在于,直到 19 世纪末,时间才被很好地标准化。地区甚至城市都有自己的时区。在此之前,local mean time 是“最先进的”。在此之前大多只是日晷。大约在 19 世纪末,欧洲一个国家/地区相继开始对时间进行标准化。示例:Wikipedia about the history of CET in central Europe

    The Postgres manual about time zones:

    时区和时区惯例受政治影响 决定,而不仅仅是地球几何。世界各地的时区变成 在 1900 年代有些标准化,但仍然倾向于 任意更改,特别是在夏令时方面 规则。 PostgreSQL 使用广泛使用的 IANA (Olson) 时区数据库 有关历史时区规则的信息。 [...]

    显然,您未公开的时区在 1892-05-01 11:42 左右发生了变化。

    要深入了解,您需要考虑:

    • 您当前会话的时区设置。

      • 如果是localtime,请查看客户端操作系统的本地时间设置。在 Unix shell 中使用 date +%Z 进行查找(在您的客户端上!)。
    • 你正在使用的客户端(不同的客户端如何表示时间戳有不同的想法)

    • 您的 Postgres 版本。 IANA tz 数据库不断更新以修复历史错误并添加新更改。目前(Postgres 11.1)使用,according to the readme in the source code

      此目录中的代码当前与 tzcode 版本同步 2018g。与 原始的 tzcode 库,但上游版本中的差异应该 通常会传播到我们的版本。以下是一些关于此的说明。

    您可能依赖于 Postgres (9.5.?) 的单点发布,因为更新也随单点发布一起提供。

    也许重新考虑您的实际要求。有什么问题吗?

    【讨论】:

    • 感谢您的详细回答。如果1892-05-03 03:00:00+01:001892-05-03 02:17:30+00:17:30 实际上是一样的,你是对的,没有问题。我的问题是,如果我的时区(欧洲/布鲁塞尔)某个地方没有 25 分钟的时间跳跃,我看不出它们是如何相同的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多