나는 최근에일부 코드를 작성했습니다.Olson zoneinfo 데이터베이스에서 바이너리 시간대 데이터를 구문 분석합니다. 내가 아는 한 내 코드는 정확하고 일치합니다.사양C에 쓰여진대로.
그러나 내 도구의 결과를 zdump
표준 도구의 결과와 비교하면 다른 결과가 나타납니다! 제 생각에는 우리가 데이터를 기반으로 작업을 하기 때문에 이상합니다. 내 도구가 생성하는 것은 다음과 같습니다.
$ ./mytool /usr/share/zoneinfo/Pacific/Honolulu
3137684296: name:HDT offset:-34200 DST:true type:Wall
3139531096: name:HST offset:-37800 DST:false type:Wall
3414769096: name:HDT offset:-34200 DST:true type:Wall
3529591096: name:HST offset:-37800 DST:false type:Wall
3582817096: name:HST offset:-36000 DST:false type:Wall
이것이 zdump
나에게 주는 것입니다:
$ zdump -v /usr/share/zoneinfo/Pacific/Honolulu
/usr/share/zoneinfo/Pacific/Honolulu Fri Dec 13 20:45:52 1901 UTC = Fri Dec 13 10:15:52 1901 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu Sat Dec 14 20:45:52 1901 UTC = Sat Dec 14 10:15:52 1901 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu Sun Apr 30 12:29:59 1933 UTC = Sun Apr 30 01:59:59 1933 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu Sun Apr 30 12:30:00 1933 UTC = Sun Apr 30 03:00:00 1933 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu Sun May 21 21:29:59 1933 UTC = Sun May 21 11:59:59 1933 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu Sun May 21 21:30:00 1933 UTC = Sun May 21 11:00:00 1933 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu Mon Feb 9 12:29:59 1942 UTC = Mon Feb 9 01:59:59 1942 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu Mon Feb 9 12:30:00 1942 UTC = Mon Feb 9 03:00:00 1942 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu Sun Sep 30 11:29:59 1945 UTC = Sun Sep 30 01:59:59 1945 HDT isdst=1
/usr/share/zoneinfo/Pacific/Honolulu Sun Sep 30 11:30:00 1945 UTC = Sun Sep 30 01:00:00 1945 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu Sun Jun 8 12:29:59 1947 UTC = Sun Jun 8 01:59:59 1947 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu Sun Jun 8 12:30:00 1947 UTC = Sun Jun 8 02:30:00 1947 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu Mon Jan 18 03:14:07 2038 UTC = Sun Jan 17 17:14:07 2038 HST isdst=0
/usr/share/zoneinfo/Pacific/Honolulu Tue Jan 19 03:14:07 2038 UTC = Mon Jan 18 17:14:07 2038 HST isdst=0
하나 있다많은더 많은 데이터가 있습니다! 그리고 14개 행은 5개 행의 배수가 아니므로 정말 질문해야 합니다. 이 모든 데이터는 어디서 가져오는 걸까요? zdump
내가 모르는 다른 데이터 소스를 쿼리하시나요 ?
이상하게도,일부zoneinfo 파일을 보면 결과가 다소 정확해 보입니다. 하지만 이상하게도 내가 보고한 모든 Unix 타임스탬프는미래. 나보다 tz 데이터베이스를 더 잘 아는 사람이 이 이상한 동작을 설명할 수 있습니까?
답변1
Zdump는 32비트 time_t 범위의 시작과 끝에서 추가 가짜 "스위치"를 보고합니다. 이는 1901 및 2038 값과 5 대신 7개의 전환이 표시되는 이유를 설명합니다. 또한 각 전환 직전과 직후에 하나씩 쌍으로 시간 전환을 보고합니다. 따라서 7개가 아닌 14개를 얻게 됩니다.
그런데 zdump는 zoneinfo 파일의 내용을 직접 반복하는 것이 아니라 localtime 함수를 사용하여 다양한 time_t 값을 시도함으로써 작동한다는 것을 알아야 합니다. 이러한 방식으로 실제 zoneinfo 파일과 마찬가지로 POSIX 스타일 TZ 지정자와 함께 작동합니다. (또한 기본 Windows 시간대 변환을 보고하도록 수정한 적이 있으므로 zoneinfo 내부에 전혀 의존하지 않았습니다.)
모든 도구의 타임스탬프가 "미래"인 이유는 음수 값(Pacific/Honolulu의 모든 변환은 1970년 이전임)을 부호 없는 값으로 잘못 해석하고 있기 때문입니다.