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?
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
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! –
@Paul - Tất cả chúng ta đều có những khoảnh khắc đó - Tôi đã nhớ nhiều hơn :-) –