2012-02-10 31 views
8

मेरे पास एक अंशकालिक युग टाइमस्टैम्प है, जिसे double के रूप में दर्शाया गया है, जिसे मैं उपयुक्त std::chrono::time_point में परिवर्तित करना चाहता हूं। युग 1/1/1970 के बाद से सामान्य यूनिक्स युग है। मुझे पता है कि std::chrono::system_clock::from_time_t मौजूद है, लेकिन time_t में कोई अंश भाग नहीं है। सी ++ 11 के साथ ऐसा करने का सबसे अच्छा तरीका क्या होगा?एक fractional epoch timestamp (double) को std :: chrono :: time_point में कैसे परिवर्तित करें?

यह प्रश्न unix timestamp to boost::posix_time::ptime से संबंधित है, सिवाय इसके कि यह इसके बूस्ट संस्करण के बजाय C++ 11 के लिए पूछ रहा है।

+0

तुम पर पढ़ा है [N2661] (http://www.open-std.org/jtc1/sc22/ wg21/docs/कागजात/2008/n2661.htm)? – ildjarn

+0

"(...) fractional epoch timestamp, जिसे 'डबल' के रूप में दर्शाया गया है" क्या इकाइयां? क्या आप युग को जानते हैं? –

+0

@ आर। मार्टिन्होफर्नैंड्स: यह 1/1/1970 के बाद मानक यूनिक्स युग है। – mavam

उत्तर

12

युग का मानना ​​एक ज्ञात clock प्रकार जैसा है, आप double प्रतिनिधित्व के साथ अवधि का उपयोग कर सकते हैं और उस घड़ी द्वारा उपयोग की जाने वाली अवधि में कनवर्ट कर सकते हैं।

// change period to appropriate units - I'm assuming seconds 
typedef std::chrono::duration<double, std::ratio<1>> d_seconds; 

d_seconds since_epoch_full(324324.342); 
auto since_epoch = std::chrono::duration_cast<clock::duration>(since_epoch_full); 
clock::time_point point(since_epoch); 

यह, कि घड़ी को शामिल किसी भी गणना के लिए ठीक होना चाहिए, क्योंकि आप घड़ी के रूप में ही परिशुद्धता का उपयोग कर रहे हैं, लेकिन यह रूपांतरण में परिशुद्धता के कुछ खो सकते हैं। यदि आप इसे खोना नहीं चाहते हैं तो आपको time_point विशेषज्ञता का उपयोग करना होगा जो double-आधारित अवधि प्रकार का उपयोग करता है। और फिर अपनी गणनाओं में इसका उपयोग करें (बेशक, फ्लोटिंग-पॉइंट गणित की सभी चेतावनियों के साथ)।

typedef std::chrono::time_point<clock, d_seconds> d_time_point; 

हालांकि, यह उसी घड़ी से जुड़े किसी भी गणना को जटिल करेगा, क्योंकि इसे रूपांतरण की आवश्यकता होगी। इस आसान बनाने के लिए, आप अपने खुद घड़ी आवरण कि रूपांतरण करता है का निर्माण और उपयोग करें कि कर सकते हैं:

template <typename Clock> 
struct my_clock_with_doubles { 
    typedef double rep; 
    typedef std::ratio<1> period; 
    typedef std::chrono::duration<rep, period> duration; 
    typedef std::chrono::time_point<my_clock_with_doubles<Clock>> time_point; 
    static const bool is_steady = Clock::is_steady; 

    static time_point now() noexcept { 
     return time_point(std::chrono::duration_cast<duration>(
        Clock::now().time_since_epoch() 
       )); 
    } 

    static time_t to_time_t(const time_point& t) noexcept { 
     return Clock::to_time_t(typename Clock::time_point(
          std::chrono::duration_cast<typename Clock::duration>(
           t.time_since_epoch() 
          ) 
         )); 
    } 
    static time_point from_time_t(time_t t) noexcept { 
     return time_point(std::chrono::duration_cast<duration>(
        Clock::from_time_t(t).time_since_epoch() 
       )); 
    } 
}; 
+0

'324324.342' के साथ क्या है? – Puppy

+0

उत्तर के लिए धन्यवाद। क्या आप विस्तार से ध्यान देंगे कि परिशुद्धता में कमी कहां उत्पन्न होती है? साथ ही, क्या घड़ी का प्रकार 'd_time_point' में मनमाना हो सकता है? – mavam

+0

@ माथियास: परिशुद्धता में हानि यह है क्योंकि घड़ी की मूल अवधि का प्रकार आपके पास 'डबल' के रूप में सटीक अवधि का प्रतिनिधित्व करने में सक्षम नहीं हो सकता है। उदाहरण के तौर पर, यदि अवधि 10.5 सेकेंड है, लेकिन घड़ी 1 सेकंड के साथ एक अभिन्न अवधि का उपयोग करती है, तो परिवर्तित होने पर यह 10s या 11s बन जाएगी। आदर्श रूप में, 'd_time_point' में घड़ी का प्रकार एक ही युग के साथ होना चाहिए। –