2009-04-17 30 views
27

में स्थानीय टाइम्स और जीएमटी/यूटीसी के बीच कनवर्ट करना सी/सी ++ में स्थानीय समय और यूटीसी के बीच डेटाटाइम को बदलने का सबसे अच्छा तरीका क्या है?सी/सी ++

"डेटाटाइम" द्वारा, मेरा मतलब है कि कुछ समय का प्रतिनिधित्व जिसमें दिन और समय-सारिणी होती है। मैं time_t, struct tm, या किसी भी अन्य प्रतिनिधित्व से खुश रहूंगा जो इसे संभव बनाता है।

मेरा प्लेटफ़ॉर्म लिनक्स है।

यहां एक विशिष्ट समस्या है जिसे मैं हल करने की कोशिश कर रहा हूं: मुझे जूलियन तिथि और दिन में कई सेकंड वाले मानों की एक जोड़ी मिलती है। वे मूल्य जीएमटी में हैं। मुझे इसे स्थानीय-टाइमज़ोन "YYYYMMDDHHMMSS" मान में परिवर्तित करने की आवश्यकता है। मुझे पता है कि जूलियन तिथि को वाई-एम-डी में कैसे परिवर्तित किया जाए, और जाहिर है कि सेकंड को एचएचएमएमएसएस में परिवर्तित करना आसान है। हालांकि, मुश्किल हिस्सा टाइमज़ोन रूपांतरण है। मुझे यकीन है कि मैं एक समाधान का पता लगा सकता हूं, लेकिन मैं चारों ओर ठोकर खाने के बजाय "मानक" या "जाने-माने" तरीका ढूंढना पसंद करूंगा।


एक संभवतः संबंधित सवाल Get Daylight Saving Transition Dates For Time Zones in C

उत्तर

21

आप gmtime/localtime और timegm/mktime के संयोजन का उपयोग करना चाहिए रहे हैं। इससे आपको struct tm और time_t के बीच रूपांतरण करने के लिए ऑर्थोगोनल टूल देना चाहिए।

/GMT के लिए:

time_t t; 
struct tm tm; 
struct tm * tmp; 
... 
t = timegm(&tm); 
... 
tmp = gmtime(t); 

स्थानीयसमय के लिए:

t = mktime(&tm); 
... 
tmp = localtime(t); 

सभी tzset() करता TZ वातावरण चर से आंतरिक समय क्षेत्र चर सेट है। मुझे नहीं लगता कि इसे एक से अधिक बार बुलाया जाना चाहिए।

यदि आप टाइमज़ोन के बीच कनवर्ट करने का प्रयास कर रहे हैं, तो आपको struct tm के tm_gmtoff को संशोधित करना चाहिए।

+0

धन्यवाद! मुझे टाइमगैम() की तरह कुछ पता था, लेकिन नाम नहीं पता था। –

+0

मदद करने के लिए खुशी हुई। समय रूपांतरण एक कठिन क्षेत्र हो सकता है। जब भी संभव हो यूटीसी में सबकुछ स्टोर करना एक अच्छा विचार है। टाइमज़ोन के बीच कनवर्ट करना भी मुश्किल है! –

+1

हाँ, दुर्भाग्य से सिस्टम के डिजाइनरों ने स्थानीय समय को मैसेजिंग प्रोटोकॉल के लिए "मानक" टाइमस्टैम्प प्रारूप के रूप में चुना। जब लोग ऐसा करते हैं तो मुझे इससे नफरत है। –

2

यदि आपको टाइमज़ोन नियमों के साथ तिथि/समय को बदलने के बारे में चिंता करने की आवश्यकता है, तो आप ICU पर देखना चाहेंगे।

17

तो विंडोज पर, आप आप के लिए timegm() उपलब्ध नहीं है:

struct tm *tptr; 
time_t secs, local_secs, gmt_secs; 
time(&secs); // Current time in GMT 
// Remember that localtime/gmtime overwrite same location 
tptr = localtime(&secs); 
local_secs = mktime(tptr); 
tptr = gmtime(&secs); 
gmt_secs = mktime(tptr); 
long diff_secs = long(local_secs - gmt_secs); 

या कुछ इसी तरह ...

+0

' secs' और 'gmt_secs' समान नहीं होना चाहिए? मुझे लगता है कि आप सरल बना सकते हैं यह काफी कुछ है। – jowo

+1

मैंने कोशिश की। मैंने इसके विपरीत परिणाम का परीक्षण करके इसे सत्यापित करने की कोशिश की। कुछ बार यह काम करता है, और दूसरों के लिए, यह एक घंटे से दूर है। मुझे लगता है कि ऐसा इसलिए है क्योंकि डीएसटी शुरू होता है और बंद हो जाता है विभिन्न स्थानों में अलग-अलग तिथियों पर मैं कोशिश कर रहा हूं (जीएमटी का उपयोग करके, लेकिन पीएसटी लोकलटाइम के खिलाफ कनवर्ट करना)। क्या इसके लिए क्षतिपूर्ति करने का कोई तरीका है? –

+1

यह संस्करण, जो बूस्ट पॉज़िक्स टाइम लाइब्रेरी का उपयोग करता है, अलग-अलग डीएसटी तिथियों के बावजूद काम करता है समय क्षेत्र में: http://stackoverflow.com/a/6849810/857029। –

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