왜 Postgres에서 0001 년에 표준 시간대에 UTC와 같은 미친 오프셋이 있습니까?


16

Postgres 9.5에서 연도를 실험하면서 아래 결과를 보게되어 놀랐습니다. 0001 (0 년 없음)0000 .

오프셋 -07:52:58 ?

예제 코드입니다. 나는 혼합 사용하는 것을주의 TIMESTAMP WITH TIME ZONE하고 TIMESTAMP 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. America/Los_AngelesUTC 오프셋보다 8 시간 뒤인 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 년의 첫 순간을 취하고 1 시간을 빼면 1 년이 걸리지 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우리가에서 뛰어 있도록 0001하는 0001 BC; 제로 년 없음 0000.

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


BC와 AD 사이의 피벗 포인트는 1 년입니다. 1 년 또는 1 년입니다. 몇 년이 원래 이름을 붙인 방법입니다. Year 0은 존재하지 않습니다 (또는 존재하는 것이 아니라 정의 문제에 가깝기 때문에 정의되지 않습니다).
slebetman

2000 년 축제 때 일부 사람들이 2000 년이 아니라 2001 년에 기술적으로 두 번째 천년기가 시작되었다고 말했던 것을 기억하십니까? 그 이유입니다. 년 1이 아닌 0에서 시작하여 1 년 전에 년 년 1 개 BC (즉 년 -1.)
slebetman

1
사용중인 캘린더에 따라 @slebetman 다발성 Gregorian은 1 CE 전 연도 0을 사용하는 형식과 1 CE 직전 1 BCE를 사용하는 형식을 모두 가지고 있습니다 (ISO 8601은 0000유효한 연도 값을 가지지 만 사용 여부를 주장하지는 않음) ). PostgreSQL이 0 년이없는 양식을 사용하는 것은 사실이지만, "일년은 0이 아닌 1을 시작합니다"라고 말할 수는 없습니다. 예를 들어 천문학적 데이터를 위해 이들 사이를 쉽게 번역 할 수 있습니다. (이것은 1 CE 이후 세 번째 천년기에 남아 있기 때문에 세 번째 천년기는 여전히 2001 년 하나의 방법에 시작)
존 한나

@JonHanna : 당시에 아무도 그 어떤 형태의 다발성 그레고리력을 사용하고 있지 않았으므로, 여기서는 0 년이없는 율리우스 력을 특권으로 여기는 것이 공정하다고 생각합니다.
케빈

답변:


22

1883 년 11 월 18 일 12:00 (새 시간)에 미국 철도에서 표준 시간이 채택되었습니다.

이는 그 전에 로스 앤젤레스가 평균 태양 시간을 기준으로 실제 현지 시간을 사용했음을 의미합니다. 그 후, 그리니치 표준시와 시간의 통합 된 오프셋 인 현지 시간대로 이전 시간과 약간 다릅니다.

더 알고 싶으세요?

  • IANA : 시간대에서 tzdata 시간대 데이터베이스를 다운로드하십시오 .

  • 내부에는 시간에 따라 많은 변형이있는 (다수의) 시간대의 정의와 변경 내용 및시기를 자세히 설명하는 많은 주석이 있습니다. 재미있는 독서입니다!

  • 위키 백과는 또한 위키 백과 : 시간대 페이지에서 1883 년 11 월 18 일 변경에 관한 흥미로운 사실을 가지고 있습니다.

철도 시간
...
19 세기 중반 미국 철도의 계시는 다소 혼란 스러웠습니다. 각 철도는 일반적으로 본사 또는 가장 중요한 종착역의 현지 시간을 기준으로 자체 표준 시간을 사용했으며, 철도 시간표는 자체 시간을 사용하여 게시되었습니다. 여러 철도가 운행하는 일부 정션에는 각 철도마다 시계가 있으며 각각 시간이 다릅니다.
... Dowd의 시스템은 미국 철도에서 결코 받아 들여지지 않았습니다. 대신, 미국 및 캐나다 철도는 Traveler 's Official Railway Guide의 편집자 인 William F. Allen이 제안한 버전을 구현했습니다. 시간대 경계는 종종 주요 도시의 철도역을 통과했습니다. 예를 들어 동부 표준 시간대와 중앙 표준 시간대의 경계는 디트로이트, 버팔로, 피츠버그, 애틀랜타 및 찰스턴을 통과했습니다. 그것은 일요일에 취임했다 1883년 11월 18일 라고도, "2 Noons의 날" 각 철도역 시계가 표준 시간 정오로 재설정 각 시간대 이내의 거리였다. 이 구역들은 대륙간, 동부, 중부, 산 및 태평양으로 명명되었습니다. ...

또한 이것은 Postgresql에만 국한되지 않습니다. 이것은 tzdata 데이터베이스를 사용하는 모든 소프트웨어 또는 운영 체제에 유효합니다. 다른 시간).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.