2010-12-16 10 views
39

क्या कोई "मानक" तरीका है या सबसे अच्छा मैं इसे gregorian::date(1970,1,1) से घटाकर सीधे गणना कर सकता हूं?मैं boost :: posix_time :: ptime से time_t को कैसे परिवर्तित करूं?

+4

बस एक विचार; मैं ग्रेगोरियन कैलेंडर में स्पष्ट समय के बजाय बूस्ट :: posix_time :: from_time_t (0) का उपयोग कर रहा हूं, एक संदर्भ-बिंदु प्राप्त करने के लिए जो स्वचालित रूप से संकलित सिस्टम के युग में समायोजित हो जाएगा। – Rawler

+0

@ राउलर, यह संभवतः बेहतर है - मुझे पता चला है कि वास्तविक युग स्पष्ट रूप से 'ग्रेगोरियन :: दिनांक (1 9 70,1,1)' के प्रतिनिधित्व से पहले 2000ns है। –

+1

@BrianCain आप कुख्यात युग टाइमस्टैम्प से पहले 2000ns के साथ कहाँ आए थे? जहां तक ​​मुझे याद है और पढ़ा है, मैंने हमेशा सुना है कि युग 1 9 70-01-01 00: 00: 00.0 यूटीसी है। –

उत्तर

14

time_t सेकंड में समय (आमतौर पर युग समय) रखने के लिए उपयोग किया जाने वाला प्रकार है। मुझे लगता है कि आप युग के समय के बाद हैं, यदि ऐसा है तो मैं वास्तव में आपके द्वारा पहले से ही घटाए गए एक तरफ से सीधे युग समय प्राप्त करने के बढ़ावा में किसी भी तरह से अवगत नहीं हूं। एक बार आपके पास time_duration (घटाव का परिणाम) हो जाने पर, आप time_t में अवधि और स्टोर पर total_seconds() पर कॉल कर सकते हैं।

बीटीडब्ल्यू। यदि आप युग के समय के बाद हैं, तो आप gettimeofday() का उपयोग कर सकते हैं और खुद को कुछ सिरदर्द बचा सकते हैं!

5

मैं सबसे अच्छा तुम क्या to_tm उपयोग कर रहा है एक tm और mktime एक time_t को tm कन्वर्ट करने के लिए प्राप्त करने के लिए कर सकते हैं विश्वास करते हैं।

+3

लेकिन मेरा मानना ​​है कि एमकेटाइम में समय क्षेत्र समायोजन अंतर्निहित है (यह स्थानीय समय में युग से सेकंड की संख्या दिखाता है) ' – gerrytan

31

चूंकि @ icecrime की विधि दो बार परिवर्तित होती है (पीटा आंतरिक रूप से रैखिक प्रतिनिधित्व का उपयोग करती है), मैंने इसके बजाय प्रत्यक्ष गणना का उपयोग करने का निर्णय लिया है। संदेश यह है:

time_t to_time_t(boost::posix_time::ptime t) 
{ 
    using namespace boost::posix_time; 
    ptime epoch(boost::gregorian::date(1970,1,1)); 
    time_duration::sec_type x = (t - epoch).total_seconds(); 

    // ... check overflow here ... 

    return time_t(x); 
} 

संपादित करें: धन्यवाद मेरे ध्यान में लाने के लिए @jaaw। चूंकि 1.58 को बढ़ावा देने के बाद यह फ़ंक्शन date_time/posix_time/conversion.hpp, std::time_t to_time_t(ptime pt) में शामिल किया गया है।

+13

इस तरह की करुणा है कि उन्होंने इसे लाइब्रेरी में प्रत्यक्ष फ़ंक्शन कॉल के रूप में नहीं जोड़ा है ... मुझे आश्चर्य है कि कारण क्या हैं थे ... – Nim

+2

प्रत्येक कॉल कंप्यूटिंग बनाम पीटाई युग स्थिर बनाम बना सकता है। –

+0

रूपांतरण में std :: time_t posix_time :: to_time_t (posix_time :: ptime pt) का उपयोग करें। एचपीपी – jaaw

14

यहां @ ybungalobill की विधि का एक बदलाव है जो आपको पिछले 2038 में मिलेगा, बस मामले में। :)

int64_t rax::ToPosix64(const boost::posix_time::ptime& pt) 
{ 
    using namespace boost::posix_time; 
    static ptime epoch(boost::gregorian::date(1970, 1, 1)); 
    time_duration diff(pt - epoch); 
    return (diff.ticks()/diff.ticks_per_second()); 
} 
+0

time_t कई प्रणालियों पर पहले से 64 बिट है। – ybungalobill

+1

हां, लेकिन जब आप एक क्रॉस-प्लेटफ़ॉर्म ऐप लिख रहे हैं, तो आपको 32-बिट का भी समर्थन करना होगा। – kgriffs

+2

@ybungalobill: समस्या इतनी अधिक नहीं है 'time_t' लेकिन 'time_duration :: sec_type' जो 32-बिट (कम से कम मेरी मशीन पर) है। –

2

इन 2 लाइनों को यह करना चाहिए।

tm td_tm = to_tm(pt); 
time_t tt = mktime(&td_tm); 
+5

इस बात से सावधान रहना और ऊपर के आइसक्रीम के समाधान पॉज़िक्स एमकेटाइम के इनपुट अनुबंध है। mktime एक संरचना लेता है "स्थानीय समय के रूप में व्यक्त किया जाता है, कैलेंडर समय प्रतिनिधित्व के लिए" और इसे आपके लिए परिवर्तित करता है। हालांकि, tm संरचना को भरते समय p_time को आपके लिए कोई भी TZ रूपांतरण नहीं करता है। तो यदि आप यूटीसी 1 जनवरी, 1 9 70 मध्यरात्रि के बाद से # सेकंड के रूप में एक पूर्ण युग के समय की तलाश में हैं और आपकी मशीन का स्थानीय टीजेड जीएमटी नहीं है, तो यह कॉल आपको वह प्राप्त करने वाला नहीं है जो आप चाहते हैं। एक स्पष्ट रूप से निर्मित युग को घटाना और दूसरा अंतर लेना स्पष्ट, स्पष्ट और tz-safe है। – timmyl

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