2014-04-01 4 views
1

9.3.3에서 하나를 실행하는 경우 :왜 Postgres의 시간대가 1967/68 년으로 바뀌나요?

select EXTRACT(TIMEZONE FROM timestamp with time zone '1911-03-01 00:00 -8:00:00'), EXTRACT(TIMEZONE FROM timestamp with time zone '1911-05-15 00:00 -8:00:00'), EXTRACT(TIMEZONE FROM timestamp with time zone '1917-03-01 00:00 -8:00:00'), EXTRACT(TIMEZONE FROM timestamp with time zone '1917-05-15 00:00 -8:00:00'), EXTRACT(TIMEZONE FROM timestamp with time zone '1967-03-01 00:00 -8:00:00'), EXTRACT(TIMEZONE FROM timestamp with time zone '1967-05-15 00:00 -8:00:00'), EXTRACT(TIMEZONE FROM timestamp with time zone '1968-03-01 00:00 -8:00:00'), EXTRACT(TIMEZONE FROM timestamp with time zone '1968-05-15 00:00 -8:00:00');

하나는 다음과 같은 결과를 가져옵니다

0;0; 
0;3600; 
0;3600; 
3600;3600 

(처음으로 라스 베이거스의 창립 날을, 다음 몇 몇 가지

1911 년경에는 오프셋이없고 여름에는 1911-1967 사이의 오프셋이 있지만 겨울이 아니라면 항상 1968 년 이후의 오프셋이있는 것처럼 보입니다. 이것은 조금 이상하게 보입니다. 아무도 여기에 오프셋으로 무슨 일이 일어나고 있는지 또는 이것이 예상 된 동작인지 아니면 내 Linux 설정에서 변경 될 수있는 것이 있는지 생각할 수 있습니까?

+0

시간대는 어느 것입니까? – leonbloy

+0

나는 런던에 있는데, 일광 절약 시간을 지켜 봤다. (그러므로 나는 시간대를 조사했다!). –

+0

나는 "진짜"시간대에 대해서 묻지 않고, 결과에 영향을 미치는 postgresql에서 당신의 설정 한 시간대에 대해서 물어볼 것이다. 'show timezone;'실행 – leonbloy

답변

3

모든 이유로 시간대가 변경됩니다.

일광 절약 시간제가 변경됩니다.

국가가 정치적 이유로 시간대를 재정의하는 경우 때때로 시간대 오프셋도 변경됩니다.

표준 시간대 정보 데이터베이스는 Olsen 데이터베이스라고 불리는 the tz or "zoneinfo" database입니다. The zoneinfo DB is on the IANA site. programs to dump human readable versions of the DB의 다양성이 있습니다.

시간대와 상관없이 특정 시간을 벽시계로 저장하려면 timestamp without time zone을 사용할 수 있습니다.

timestamp with time zone은 입력 및 출력에서 ​​시스템 TimeZone 설정에 민감하며 UTC 시간으로 절대 초로 저장됩니다. 그래서 그것은 입력과 출력을 위해 변환됩니다. 다른 전환을 원하거나 전환을 재정의하려면 AT TIME ZONE 연산자를 사용할 수 있습니다.

+0

그래서 '시간대가있는 타임 스탬프를 선택하십시오' '1911-03-01 00:00 -8 : 00 : 00'시간대 'UTC'; '그러면 올바르게 결과를 얻습니다.'1911-03- 01 08 : 00 : 00'. 그러나 나는 또한 그 시간에 타임 스탬프와 관련된 오프셋을 추출하고자합니다. 그것을 시도 할 때, 질문에서와 같이, 그것은 나에게 0을 준다. zoneinfo는 그런 식으로 어떻게 구성되어 있는가? [이] (https://github.com/eggert/tz/blob/master/northamerica)는 406 행에서 -7 : 52 : 58이어야한다고 말하지 않습니까? 그렇지 않으면 내 로컬 시간대의 런던 시간을 어떻게 든 기반으로합니까? –

+1

@WilliamBecker 아니요, 타임 스탬프는 입력시 변환됩니다. TZ 오프셋은 유지되지 않으며이를 유지하고 나중에 추출 할 방법이 없습니다. TZ 오프셋을 유지하려면 별도로 저장해야합니다. 예, 반대 직관적입니다. –

1

귀하의 시간대 규칙은 법률에 의해 제정되어 법이 변경됩니다.

+0

이 법률은 어딘가에 열거되어 있습니다. 나는 그것이 왜 그런 식으로 행동 하는지를 판단 할 수 있습니까? –

+1

@WilliamBecker : 상당히 복잡합니다 : http://www.iana.org/time-zones – leonbloy

+0

그래서 여기에 사람이 읽을 수있는 형식으로 zoneinfo db의 공개 repostiory가 있습니다 : https://github.com/eggert/tz/blob/master/northamerica. 태평양 시간을 다루는 로스 앤젤레스를 찾는 것은 1911 년과 1921 년 사이에 상황이 바뀌는 이유를 언급하지 않습니다 (라인 400 둘러보기). –

1

도시가 설립 된 날에 라스베가스의 (현지) 시계가 00:00:00으로 표시된 인스턴트를 저장하고 라스베가스가 -8 시간 오프셋을 사용한다고 가정하면 필드에 1911-03-01 00:00 -8:00:00::timezonetx을 저장해야합니다. 그러나 실제로 저장되는 것은 "보편적 순간"일 뿐이며, "라스 베이거스의 현지 시간"을 알 수 없으면 읽을 수 있습니다 (읽은 후 읽은 다음 시간대로 변환하지 않는 한).).

+0

이렇게하고 싶지만'EXTRACT (TIMEZONE FROM 타임 스탬프 '1911-03-01 00:00 -8 : 00 : 00'타임 스탬프), 타임 스탬프 '1911-03- 01 00:00 -8 : 00 : 00 ';'결과로 나에게 준다 :'0; "1911-03-01 08 : 00 : 00 + 00"'- 시간대 정보를 잃어 버렸다. 질문. 이 오프셋 정보를 '타임 스탬프가있는 타임 스탬프'에 어떻게 저장할 수 있습니까? –

+1

PG에 들어갈 수 없습니다. 타임 스탬프는 항상 타임 존이나 오프셋없이 저장됩니다 (타임 존 또는 오프셋은 읽기 전용 또는 쓰기 용으로 변환하기 위해 사용됩니다). 예, 혼란 스럽지만 datetime 관리는 복잡합니다. 의견에서 내 연결된 답변을 읽어보십시오. – leonbloy

+0

필자의 경우, 시간대 'UTC'로 항상 쿼리하여 모든 곳에서 정규화 된 시간을 가져오고 오프셋을 다른 열에 저장하여 로컬 시간을 렌더링하는 것이 가장 좋을까요? –

0

시간대에 따라 다릅니다. 1966 년에 DST was first implemented nationally in the US이 1967 년에 일어났습니다. 여러 국가에서 법률을 통과해야만 여러 지역에서 1967 년이 DST를 사용하는 유일한 해입니다. 이로 인해 1967/68 년을 제외한 모든 날짜가 정상적으로 작동하는 몇 가지 매우 흥미로운 글리치가 발생할 수 있습니다.