2011-12-19 16 views
11

मैंने यहां कई अलग-अलग विचार देखा, इसलिए यहां पूछने का विचार।mktime और tm_isdst

(A positive or zero value for tm_isdst causes mktime() to presume initially 
that summer time (for example, Daylight Saving Time) is or is not in 
effect for the specified time, respectively. A negative value for 
tm_isdst causes the mktime() function to attempt to divine whether summer 
time is in effect for the specified time. 

मेरे सवाल है, नहीं tm_isdst अगर इसकी डीएसटी या नहीं और इस तरह से कोड डीएसटी नास्तिक हो जाता है प्रणाली तय करने देने के लिए -1 के रूप में रखा जाना चाहिए:

मैं man mktime पढ़ा है?

क्या मुझे कुछ याद आ रही है?

उत्तर

5

मेरा मानना ​​है कि इसके लिए मूल कारण कुछ समय क्षेत्र में डेलाइट बचत समय नहीं है। चूंकि mktime async-safe नहीं है और न ही यह पुन: प्रवेशकर्ता कार्यान्वयन को POSIX बाहरी चार tzname [2] में डेलाइट बचत के वर्तमान मूल्य को संग्रहीत करने की अनुमति देता है, जो डेलाइट [0 या 1] द्वारा अनुक्रमित है। इसका मतलब है tzname [0] = "[std TZ name]" और tzname = "[डेलाइट टीजेड नाम, उदा। ईडीटी]"

इस पर अधिक जानकारी के लिए अपने tzset() मैन पेज देखें। Mktime() को अनुरूप मानकों को व्यवहार करने की आवश्यकता होती है जैसे कि इसे tzset() को वैसे भी कहा जाता है। इस तरह के tm_isdst, आईएमओ के उपयोग को रोकता है।

नीचे पंक्ति: आपका विशेष कार्यान्वयन और टाइमज़ोन यह निर्धारित करेगा कि आप tm_isdst के लिए -1, 0, या 1 का उपयोग करेंगे या नहीं। सभी कार्यान्वयन के लिए कोई भी डिफ़ॉल्ट सही तरीका नहीं है।

7

यदि संभव हो तो आपको tm_isdst -1 को सेट करने से बचना चाहिए। प्रणाली हमेशा दिनांक और समय से डीएसटी स्थिति निर्धारित नहीं कर सकती है। डीएसटी समाप्त होने से पहले और बाद में यह संदिग्ध है। उदाहरण के लिए, यदि आप mktime() 1:30 पूर्वाह्न 4 नवंबर, 2012 को पास करते हैं, तोसे सही time_t मान प्राप्त करने के लिए पर्याप्त जानकारी नहीं है। आम तौर पर मैंने देखा है कि mktime() इस मामले में मानक समय मानता है कि यह संदिग्ध है, लेकिन मैंने कोई भी दस्तावेज नहीं देखा है जो सभी प्लेटफार्मों पर व्यवहार की गारंटी देता है। 1:30 पूर्वाह्न 4 नवंबर, 2012 tm_isdst == 1 के साथ 1 घंटा पहले होगा, क्योंकि घंटा 1:00:00 से 1:59:59 दोहराया जाता है।

#include <stdio.h> 
#include <time.h> 

int main() 
{ 
    time_t daylight, standard; 
    struct tm timestr; 
    double diff; 

    timestr.tm_year = 2012 - 1900; 
    timestr.tm_mon = 11 - 1; 
    timestr.tm_mday = 4; 
    timestr.tm_hour = 1; 
    timestr.tm_min = 30; 
    timestr.tm_sec = 0; 

    /* first with standard time */ 
    timestr.tm_isdst = 0; 
    standard = mktime(&timestr); 

    /* now with daylight time */ 
    timestr.tm_isdst = 1; 
    daylight = mktime(&timestr); 

    diff = difftime(standard, daylight); 

    printf("Difference is %f hour(s)", diff/60.0/60.0); 

    return 0; 
} 

यह पैदा करता है:

Difference is 1.000000 hour(s) 

दोनों, 2012 1:30 पूर्वाह्न, 4 नवंबर हैं लेकिन दोनों दो अलग टाइम_टी मूल्यों, 1 घंटे का अंतर है।

  • टाइम_टी
  • मरम्मत समय struct

समय struct दोनों एक इनपुट और आउटपुट है:

mktime() अनिवार्य रूप से 2 outputs है। यह सभी संरचना सदस्यों को नाममात्र श्रेणियों में वापस करने के लिए mktime() द्वारा संशोधित किया गया है। उदाहरण के लिए, यदि आप tm_hour सदस्य += 500 बढ़ाते हैं, तो इसका मतलब है कि 500 ​​घंटे तक समय बढ़ाएं। tm_hour सदस्य को 00 से 59 के मूल्य में बदल दिया जाएगा, और tm_day, tm_mday, और आदि सभी तदनुसार समायोजित किए जाएंगे। tm_isdst दोनों इनपुट और आउटपुट भी है।

  • 1 (प्रभाव में डीएसटी, अर्थात डेलाइट समय)
  • 0 (डीएसटी नहीं प्रभाव में है, अर्थात: अपने मूल्यों को इस प्रकार हैंमानक समय)
  • -1 (अज्ञात डीएसटी स्थिति)

तो mktime() होगा उत्पादन या तो एक 1 या tm_isdst के लिए 0, कभी नहीं -1।

-1 एक संभावित इनपुट है, लेकिन मैं इसे "अज्ञात" के रूप में सोचूंगा। इसका अर्थ "स्वचालित रूप से निर्धारित करें" के रूप में मत सोचें, क्योंकि सामान्य रूप से, mktime() हमेशा इसे स्वचालित रूप से निर्धारित नहीं कर सकता है।

स्पष्ट डीएसटी स्थिति (0 या 1) सॉफ़्टवेयर के बाहर बाहरी से कुछ आनी चाहिए, उदाहरण के लिए इसे फ़ाइल या डेटाबेस में संग्रहीत करें, या उपयोगकर्ता को संकेत दें।

+2

ठीक है अगर आपको डीएसटी नहीं पता है तो आपको इसे स्वयं निर्धारित करने की आवश्यकता है (इसके साथ शुभकामनाएं), या इसे '-1' पर सेट करें। कोई अन्य विकल्प नहीं है। यदि आप इसे 0 पर सेट करते हैं, तो आपको किसी भी डीएसटी को ग़लत गारंटी नहीं है, अगर आप इसे 1 पर सेट करते हैं तो आप डीएसटी को मजबूर करते हैं जिस पर भी गलत गारंटी है। – rustyx

+0

@RustyX हार्ड कोडिंग -1, 0, या 1 हमेशा गलत होगा। -1 कम से कम बुरा है, लेकिन अभी भी बुरा है। स्पष्ट स्थिति (0 या 1) उपयोगकर्ता से सॉफ़्टवेयर में _input_ होना चाहिए, या डेटा (फ़ाइल या डेटाबेस) में संग्रहीत होना चाहिए। असल में यह एप्लिकेशन के बाहर बाहरी से कुछ आना चाहिए। –

+0

वी अच्छा जवाब। धन्यवाद – drlolly

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

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