2011-02-02 18 views
10

जब आप mktime() को कॉल करते हैं, तो 1 फरवरी 31 से पहले आता है। यह क्यों है? क्या मैं कुछ गलत कर रहा हूं या यह ग्लिब में एक बग है?लिनक्स-x64 glibc: 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 

ध्यान दें कि मूल इरादा दो टाइम_टी की तुलना करने के लिए किया गया था। यह समस्या पहली तारीख/समय को दूसरे की तुलना में बाद में दिखाई देती है, जो स्पष्ट रूप से एक समस्या का थोड़ा सा है।

यह सिर्फ "gcc test.c" के साथ संकलित है और उबंटू 9 .10 पर "./a.out" के साथ चलाया गया है, जीसीसी संस्करण 4.4.1 (उबंटू 4.4.1-4ubuntu8), libc-2.10.1-0ubuntu15

32-बिट सिस्टम पर परिणाम अपेक्षित हैं - यानि 64 बिट परिणाम के लिए पूरी तरह से अलग!

क्या कोई इस परिणाम की पुष्टि/खंडन करने की देखभाल करेगा और/या कुछ गलत बता सकता है कि मैं क्या गलत कर रहा हूं?

उत्तर

12

tm_mon शून्य-आधारित है, इसलिए आपने 31 फरवरी को सेट करने का प्रयास किया, जिसे सामान्यीकृत किया गया। mktime() की परिभाषा का एक लिंक यहां दिया गया है।

+2

बस बोलते हुए, 31 फरवरी (जो वास्तव में 3 मार्च या 2 मार्च है) 1 मार्च से बाद में है। – grep

+0

धन्यवाद जिम - एक दोपहर का क्षण;) यह सुनिश्चित नहीं है कि आरटीएफएम के कई बार बाद में मुझे कैसे याद आया! –

+0

@ पॉल - हम सभी के पास ये क्षण हैं - मुझे याद रखने की अपेक्षा अधिक है :-) –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^