2009-07-22 18 views
10

मुझे युग से ptime पर सेकंड की संख्या के साथ डबल रूपांतरित करने की आवश्यकता है। मुझे यकीन है कि ऐसा करने का एक आसान तरीका होना चाहिए, लेकिन मुझे कुछ भी नहीं मिला। धन्यवाद।यूनिक्स टाइमस्टैम्प को बढ़ावा देने के लिए :: posix_time :: ptime

संपादित करें: मूल टाइमस्टैम्प फ़्लोटिंग पॉइंट है। मैं इसे बदल नहीं सकता और मैं उप-दूसरे परिशुद्धता को खोना नहीं चाहता हूं।

+0

क्या आपको यकीन है कि आपको एक डबल की आवश्यकता है? मुझे लगता है कि यह एक int में फिट बैठता है। – slipbull

+1

हां, मुझे डबल की आवश्यकता है - यह एक इंटरफेस का एक हिस्सा है जिसे मैं नहीं बदल सकता। यदि यह कई सेकंड है तो आप आंशिक भाग को कैप्चर नहीं कर सकते हैं ... और http://xkcd.com/607/ :-) – cube

उत्तर

5

कुछ नगण्य के बाद चारों ओर मैं इस के साथ आया था:

ptime(date(1970, 1, 1), time_duration(0, 0, 0, time_duration::ticks_per_second() * 1234567890.0987654321)) 

मुझे यकीन है कि यह सबसे अच्छा समाधान है नहीं कर रहा हूँ, लेकिन यह मैं क्या आवश्यकता है लगता है।

8

from_time_t() रूपांतरण फ़ंक्शन का उपयोग करें। एक time_t एक यूनिक्स टाइमस्टैम्प है, यानी युग के बाद से सेकंड की संख्या।

+1

time_t में सेकंड के आंशिक भाग नहीं हो सकते हैं, लेकिन उत्तर – cube

+0

के उत्तर के लिए धन्यवाद। time_t' लगभग किसी भी प्लेटफॉर्म पर यूनिक्स टाइमस्टैम्प है, लेकिन सी ++ मानक इस व्यवहार को निर्दिष्ट नहीं करता है। तो इस अनुवाद से सावधान रहें। –

7

एक मशीन को बढ़ावा देने दिनांक/समय माइक्रोसेकंड संकल्प के डिफ़ॉल्ट स्तर का संकलन किया है के लिए, यह प्रयास करें:

double ts = 1250524800.5; 
// Use floor() here if seconds are always positive. 
time_t secondsSinceEpoch = floor(ts); 
long microsecondsSinceSecond = 
    floor((ts - static_cast<double>(secondsSinceEpoch)) * 1000000); 
boost::posix_time::ptime result = 
    boost::posix_time::from_time_t(secondsSinceEpoch); 
boost::posix_time::time_duration fractionalSeconds(0, 0, 0, 
                microsecondsSinceSecond); 
result += fractionalSeconds; 
cout << "Time stamp is " << result << endl; 

इस के लिए उत्पादन "है समय स्टाम्प है 2009-Aug-17 16:00: 00.500000 "मेरे लिनक्स बॉक्स पर।

+2

आप शायद अपने 'microsecondsSinceSecond' गणना में' + 0.5' जोड़ना चाहते हैं ताकि निकट-निकटता प्राप्त हो सके। अन्यथा आप छंटनी कीड़े से पीड़ित होंगे। हालांकि ... मुझे लगता है कि कोई भी जो माइक्रोसॉन्ड के आधे हिस्से के अंतर की परवाह करता है, वह शायद पहले स्थान पर 'डबल' में टाइमस्टैम्प स्टोर नहीं करेगा। – Tom

+0

@ टॉम: आप यहां सही हैं, हालांकि मुझे उम्मीद है कि जो भी वास्तव में इस स्तर के संकल्प के बारे में परवाह करता है वह अपने बूस्ट वितरण को नैनोसेकंद समर्थन के लिए कॉन्फ़िगर करेगा और उपरोक्त कोड में उचित परिवर्तन करेगा। –

+0

+1 आंशिक सेकंड के लिए ग्रेट कोड स्निपेट एकाउंटिंग। –

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