为什么时区在Postgres的0001年有如此疯狂的UTC偏移量?


16

在Postgres 9.5中,我很惊讶地看到下面的年份在尝试年份0001(没有年份0 0000)时看到。

偏移量-07:52:58

一些示例代码。请注意,我混合使用TIMESTAMP WITH TIME ZONETIMESTAMP WITHOUT TIME ZONE,因此请仔细阅读。

SET TIME ZONE 'America/Los_Angeles' ;

SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0', 
        TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', 
        TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z') ;

("2015-01-01 00:00:00-08","0001-12-31 16:07:02-07:52:58 BC","0001-01-01 00:00:00")

我对第二个值感到惊讶:0001-12-31 16:07:02-07:52:58 BC。我知道我们必须向后退8 America/Los_Angeles个小时,比UTC 落后8个小时,但要相差-08:00但不是-08:00偏移量是-07:52:58。为什么?

UTC下没问题

在UTC下输入数据时没有这种问题。

SET TIME ZONE 'UTC' ;

SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0',  
        TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', 
        TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z');

("2015-01-01 00:00:00+00","0001-01-01 00:00:00+00","0001-01-01 00:00:00")

没有零年

顺便说一句,日期部分似乎是正确的。似乎没有一年0000,它是“ BC”和“ AD”时代之间的关键点。以0001年的第一刻为例,减去一个小时,便得到了年份0001 BC–因此,没有年份为零。

SET TIME ZONE 'UTC' ;

INSERT INTO moment_  -- TIMESTAMP WITH TIME ZONE.
VALUES ( TIMESTAMP '0001-01-01 00:00:00.0Z' - INTERVAL '1 hour' ) ;

SET TIME ZONE 'UTC' ;

TABLE moment_ ;

结果是年0001 BC,所以我们从跳到了00010001 BC; 没有一年零0000

"0001-12-31 23:00:00+00 BC"

另外,一个关于时区
billinkc '16

BC和AD之间的枢轴点是1年。它可以是1年或-1年。这就是年份的最初命名方式。年份0不存在(或者说是未定义的,因为它更多的是定义问题,而不是存在的问题)。
slebetman '16

还记得2000年的庆祝活动时,一些学徒们说第二个千年从2001年开始,而不是2000年吗?这就是为什么。年从1开始,而不是0。而第一年的前一年是公元前1年(即
slebetman '02

1
@slebetman,取决于所使用的日历。格里高利历人既有使用0作为1 CE之前的年份的格式,又有将1 BCE紧接在1 CE之前的格式(ISO 8601支持既具有0000有效的年份值,又不坚持是否使用它) )。PostgreSQL确实使用没有年份0的形式,但是您不能像某些普遍事实那样声明“年份以1开始,而不是0”。在它们之间进行转换很容易,例如获得天文数据。(第三个千年仍然以2001年开始,因为自从1 CE以来仍然是第三个千年)
乔恩·汉纳

@JonHanna:但是,当时实际上没有人使用过任何形式的公历,因此,我认为在这里优先使用儒略历是公平的-它没有零年。
凯文

Answers:


22

1883年11月18日12:00(新时间),美国铁路采用了标准时间。

这意味着在此之前,洛杉矶使用的是基于平均太阳时的实际当地时间。之后,将其移至本地时区,该时间与格林威治标准时间的总时差为零,与之前的时间略有不同。

想知道更多?

  • IANA:时区下载tzdata时区数据库。

  • 在内部,您会发现(许多)时区的定义,这些定义会随着时间的变化而变化,并附带大量注释,详细说明在何处以及何时进行了哪些更改。有趣的阅​​读!

  • 维基百科在Wikipedia:时区页面上还有一些有趣的事实,涉及1883年11月18日的更改:

铁路时间
...
19世纪中叶,美国铁路的计时有些混乱。每个铁路通常使用其自己的标准时间,通常基于其总部的当地时间或最重要的终点站,并且铁路的火车时刻表是使用其自己的时间发布的。几条铁路的某些路口为每条铁路都有一个时钟,每个时钟显示不同的时间。
陶氏的体系从来没有被美国铁路所接受。相反,美国和加拿大的铁路实施了《旅行者官方铁路指南》编辑威廉·艾伦(William F. Allen)提出的版本。它所在时区的边界通常在主要城市中穿过火车站。例如,东部和中部时区之间的边界穿过底特律,布法罗,匹兹堡,亚特兰大和查尔斯顿。它于1883年11月18日(星期日)开幕,也称为“两个正午之日”,当时每个火车站的时钟都已重置,因为在每个时区都达到了标准时间的正午。这些区域被命名为殖民地,东部,中部,山区和太平洋。...

另请注意,这并非特定于Postgresql。这对使用tzdata数据库的任何软件或操作系统均有效(当然,许多限制为1970年以后或1901年以后的日期,因此1883年是无法达到的,但是在该位置上还有很多很多其他调整不同的时间)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.