2011-02-05 12 views
21

के बीच इंटरऑपरेबिलिटी कैसे इंटरऑपरेबल हैं :: date_time और std :: chrono?बूस्ट :: डेट_टाइम और std :: chrono

उदाहरण के लिए, boost :: posix_time :: ptime और std :: chrono :: time_point के बीच कनवर्ट करने का कोई तरीका है?

मैंने ऐसे रूपांतरणों पर दस्तावेज़ीकरण की खोज करने की कोशिश की लेकिन कोई भी नहीं मिला।

उत्तर

13

मैं बढ़ावा पर इस पाया मेलिंग सूची के लिए प्रतिबद्ध: http://lists.boost.org/boost-commit/2009/04/15209.php

यहाँ कर रहे हैं प्रासंगिक कार्य:

template < class Clock, class Duration> 
struct convert_to<posix_time::ptime, chrono::time_point<Clock, Duration> > { 
    inline static posix_time::ptime apply(const chrono::time_point<Clock, Duration>& from) 
    { 
     typedef chrono::time_point<Clock, Duration> time_point_t; 
     typedef chrono::nanoseconds duration_t; 
     typedef duration_t::rep rep_t; 
     rep_t d = chrono::duration_cast<duration_t>(from.time_since_epoch()).count(); 
     rep_t sec = d/1000000000; 
     rep_t nsec = d%1000000000; 
     return boost::posix_time::from_time_t(0)+ 
     boost::posix_time::seconds(static_cast<long>(sec))+ 
     #ifdef BOOST_DATE_TIME_HAS_NANOSECONDS 
     boost::posix_time::nanoseconds(nsec); 
     #else 
     boost::posix_time::microseconds((nsec+500)/1000); 
     #endif 
    } 
}; 

template < class Clock, class Duration> 
struct convert_to<chrono::time_point<Clock, Duration>, posix_time::ptime> { 
    inline static chrono::time_point<Clock, Duration> apply(const posix_time::ptime& from) 
    { 
     boost::posix_time::time_duration const time_since_epoch=from-boost::posix_time::from_time_t(0); 
     chrono::time_point<Clock, Duration> t=chrono::system_clock::from_time_t(time_since_epoch.total_seconds()); 
     long nsec=time_since_epoch.fractional_seconds()*(1000000000/time_since_epoch.ticks_per_second()); 
     return t+chrono::nanoseconds(nsec); 

    } 
}; 

मुझे यकीन है कि जब वे एक बढ़ावा रिहाई का हिस्सा बनने के लिए जा रहे हैं नहीं कर रहा हूँ। वे अभी ट्रस्ट ट्रंक में नहीं लग रहे हैं ...

+9

अच्छा खोज। ये कार्य मानते हैं कि क्लॉक का युग पीटाइम: न्यू इयर्स, 1 9 70 जैसा ही है। अगर यह धारणा सच है, तो ये कार्य काम करते हैं। यदि नहीं, तो ये फ़ंक्शन एक मूक रन टाइम त्रुटि हैं। –

+0

क्या युग अलग-अलग हैं, भले ही इन कार्यों को सही ढंग से कार्यान्वित करना संभव हो? – HighCommander4

+4

मेरा मानना ​​है कि आप बहुत करीब आ सकते हैं। मैं पहले एक कस्टम chrono :: घड़ी (नामस्थान chrono होने की आवश्यकता नहीं है) है कि नए साल, 1 9 70 का एक युग है। ऊपर वर्णित अनुसार पीटा और अपने नए घड़ी के बीच कनवर्ट करें। और फिर आप उनमें से प्रत्येक से() एक के बाद एक दाएं) प्राप्त करके अपने दो chrono घड़ियों के बीच लगभग रूपांतरित कर सकते हैं। प्रत्येक समय_पॉइंट के time_since_epoch() को एक अवधि प्राप्त करने के लिए घटाएं जो आपके दो क्रोनो घड़ियों के युगों के बीच अंतर है। आप दो chrono time_points के बीच कनवर्ट करने के लिए उस अंतर को जोड़/घटाएं। –

11

आप के लिए और एक एसटीडी से एक टाइम_टी परिवर्तित कर सकते हैं :: chrono :: system_clock :: time_point:

class system_clock 
{ 
public: 
    ... 
    static time_t  to_time_t (const time_point& __t); 
    static time_point from_time_t(time_t __t); 
}; 

और आप एक ptime करने के लिए एक टाइम_टी परिवर्तित कर सकते हैं:

ptime from_time_t(time_t t); 

हालांकि मैं एक पीटा को एक समय_टी में बदलने का कोई तरीका नहीं दिखता है।

+1

आप टीएम संरचना प्राप्त करने के लिए बूस्ट के to_tm (ptime) का उपयोग कर सकते हैं और फिर time_t प्राप्त करने के लिए time.h/ctime से mktime (...) का उपयोग कर सकते हैं। देखें http://www.cplusplus.com/reference/ctime/mktime/ –

+1

सुनिश्चित करें कि आपका सॉफ्टवेयर वर्ष 2038 के बाद नहीं चलाएगा https://en.wikipedia.org/wiki/Year_2038_problem –

+0

@DarienPardinas की टिप्पणी पर विस्तार करने के लिए , 32-बिट लिनक्स प्लेटफार्म 'time_t' के लिए एक हस्ताक्षरित 32-बिट पूर्णांक का उपयोग करते हैं। यह एक वाई 2038 समस्या का कारण बन जाएगा। –

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