2011-02-02 46 views
10

Khi bạn gọi mktime(), ngày 1 tháng 2 dường như đến trước ngày 31 tháng 1. Tại sao điều này? Tôi đang làm điều gì đó sai hay là một lỗi trong glibc?Linux-x64 glibc: Tại sao ngày 1 tháng 2 đến trước ngày 31 tháng 1?

Dưới đây là các mã:

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); 

Và đây là kết quả:

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

Lưu ý rằng mục đích ban đầu là để so sánh hai của time_t. Sự cố này khiến ngày/giờ đầu tiên xuất hiện muộn hơn ngày thứ hai, điều này rõ ràng là một vấn đề.

Điều này chỉ được biên soạn với "gcc test.c" và chạy với "./a.out" trên Ubuntu 9.10, gcc phiên bản 4.4.1 (Ubuntu 4.4.1-4ubuntu8), libc-2.10.1-0ubuntu15

Trên hệ thống 32 bit, kết quả như mong đợi - nghĩa là hoàn toàn khác với kết quả 64 bit!

Có ai quan tâm để xác nhận/bác bỏ kết quả này và/hoặc cung cấp một số thông tin chi tiết về những gì tôi có thể làm sai không?

Trả lời

12

tm_mon là không dựa trên, vì vậy bạn đã cố gắng thiết lập ngày 31 tháng 2, đã được chuẩn hóa. Đây là liên kết đến định nghĩa của mktime().

+2

Nói một cách đơn giản, ngày 31 tháng 2 (thực sự là ngày 3 tháng 3 hoặc ngày 2 tháng 3) muộn hơn ngày 1 tháng 3. – grep

+0

Cảm ơn Jim - một chút về khoảnh khắc duh;) Không chắc chắn làm sao tôi bỏ lỡ sau khi RTFM'ing nhiều lần! –

+0

@Paul - Tất cả chúng ta đều có những khoảnh khắc đó - Tôi đã nhớ nhiều hơn :-) –

Các vấn đề liên quan