2011-02-02 2 views
10

mktime()을 호출하면 2 월 1 일이 1 월 31 일 이전 인 것으로 보입니다. 왜입니까? 내가 잘못했거나 glibc의 버그입니까?Linux-x64 glibc : 2 월 1 일이 1 월 31 일 전인 이유는 무엇입니까?

여기에 코드입니다 :

struct tm tm; 
time_t tt; 

memset(&tm, 0, sizeof(tm)); 
tm.tm_year = 2011; 
tm.tm_mon = 1; 
tm.tm_mday = 31; 
tm.tm_hour = 11; 
tm.tm_min = 41; 
tm.tm_sec = 28; 
tm.tm_isdst = 0; 
tt = mktime(&tm); 

printf("Time now %d-%d-%d %d:%d:%d (%s) = %lu\n", 
    tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_zone, tt); 


memset(&tm, 0, sizeof(tm)); 
tm.tm_year = 2011; 
tm.tm_mon = 2; 
tm.tm_mday = 1; 
tm.tm_hour = 1; 
tm.tm_min = 1; 
tm.tm_sec = 1; 
tm.tm_isdst = 0; 
tt = mktime(&tm); 

printf("Time now %d-%d-%d %d:%d:%d (%s) = %lu\n", 
    tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_zone, tt); 

그리고 여기에 출력입니다 :

Time now 2011-2-3 11:41:28 (PST) = 61257325288 
Time now 2011-2-1 1:1:1 (PST) = 61257114061 

참고 원래의 의도는 두 써서 time_t의를 비교했다. 이 문제로 인해 첫 번째 날짜/시간이 두 번째 시간보다 늦어지는 것으로 나타납니다. 이는 분명히 약간의 문제입니다.

이것은 "gcc test.c"로 컴파일되고 우분투 9.10, gcc 버전 4.4.1 (Ubuntu 4.4.1-4ubuntu8), libc-2.10.1-0ubuntu15에서 "./a.out"

32 비트 시스템에서 결과는 예상대로입니다 - 즉 64 비트 결과와 완전히 다릅니다!

누구든지이 결과를 확인/반박하고 내가 잘못하고있는 것에 대해 통찰력을 주겠습니까?

답변

12

tm_mon은 0부터 시작하므로 정규화 된 2 월 31 일을 설정하려고했습니다. 여기에 mktime()의 정의에 대한 링크가 있습니다.

+2

단순히 2 월 31 일 (실제로 3 월 3 일 또는 3 월 2 일)은 3 월 1 일 이후입니다. – grep

+0

짐 순간 - 비트의 비트) 내가 여러 번 RTFM을 실행 한 후 어떻게보고 싶었는지 확실하지 않습니다! –

+0

@Paul - 우리 모두는 그 순간을 가지고 있습니다 - 나는 기억해야 할 것보다 더 많은 것을 가지고 있습니다 :-) –

관련 문제