2010-02-19 7 views
11

कैसे मैं एक वर्तमान प्रणाली समय क्षेत्र का उपयोग कर boost::date_time का उपयोग कर (यूटीसी स्थानीय से विशेष रूप से, ) स्थानीय और UTC समय के बीच में बदल सकते हैं? मुझे boost::date_time::local_adjustor के बारे में पता है, लेकिन इसके लिए एक टेम्पलेट तर्क की आवश्यकता है जो एक टाइमज़ोन-निर्भर ऑफसेट है।बूस्ट :: date_time का उपयोग कर स्थानीय और सार्वभौमिक समय के बीच कैसे परिवर्तित करें?

Failing platform-independent way ऐसा करने के लिए, मैं इसे विशेष रूप से लिनक्स पर कैसे करूँगा?

एक तरफ, रूपांतरण के दौरान मौजूद गैर-मौजूद समय बिंदु कैसे हैं? उदाहरण के लिए यदि डीएसटी के कारण एक दिन छोटा होता है, और मैं लापता घंटे से एक समय बिंदु बदलने की कोशिश करता हूं, तो परिणामी सार्वभौमिक समय क्या होगा?

उत्तर

7

मैं स्थानीय और UTC समय के बीच अंतर को खोजने के लिए निम्नलिखित कोड का उपयोग कर रहा:


    using namespace boost::posix_time; 
    using namespace boost::gregorian; 

    time_duration UTC_Diff; 
    { 
     ptime someUTC_Time(date(2008, Jan, 1), time_duration(0, 0, 0, 0)); 
     ptime someLocalTime = boost::date_time::c_local_adjustor::utc_to_local(someUTC_Time); 
     UTC_Diff = someLocalTime - someUTC_Time; 
    } 

आप पाते हैं के बाद से अंतर UTC समय calcutate करने के लिए आसान is't।

+0

यह काम करता है, लेकिन दुर्भाग्यपूर्ण केवल एक ही रास्ता, और मैं गणना की ऑफसेट का उपयोग नहीं कर सकता क्योंकि डीएसटी अलग-अलग तिथियों के लिए अलग बनाता है। –

4

कुछ चयनित समय और यूटीसी के बीच एक अंतर के आधार पर यूटीसी और स्थानीय के बीच कनवर्ट करना केवल तब तक काम करता है जब तक आप डीएसटी परिवर्तन पल के एक ही तरफ रहते हैं।

निम्नलिखित किसी भी तारीख के लिए काम करेंगे (खेद यह local- नहीं कर रहा है> यूटीसी):

bpt::ptime utils::utcToLocal(bpt::ptime utcTime) 
{ 
    // NOTE: the conversion functions between ptime and time_t/tm are broken so we do it ourselves. 
    bpt::time_duration timeSinceEpoch = utcTime - bpt::ptime(boost::gregorian::date(1970, 1, 1), bpt::time_duration(0,0,0)); 
    time_t secondsSinceEpoch = timeSinceEpoch.total_seconds(); 
    tm* localAsTm = localtime(&secondsSinceEpoch); 
    return bpt::ptime(
    boost::gregorian::date(
     localAsTm->tm_year + 1900, 
     localAsTm->tm_mon + 1, 
     localAsTm->tm_mday), 
    bpt::time_duration(
     localAsTm->tm_hour, 
     localAsTm->tm_min, 
     localAsTm->tm_sec)); 
} 
5

आप सही समय क्षेत्र में एक local_date_time है, तो आप सीधे utc_time विधि का उपयोग कर सकते हैं UTC में समय मिलता है।

लगता है कि आप कुछ सादे ptime, जो आप किसी दिए गए समय क्षेत्र में होने के रूप में व्याख्या और फिर इसे उस के लिए यूटीसी को परिवर्तित करना चाहते है देखो, मैं इस निर्माता

local_date_time(...) 
    Parameters: 
    date 
    time_duration 
    time_zone_ptr 
    bool 

उपयोग कर रहा हूँ docs के अनुसार यह दिया reinterprets समय डेटा दिया समय क्षेत्र में हो सकता है, यह किसी भी ptime स्थानीय बनाना इस्तेमाल किया जा सकता है, और है कि utc_time विधि का इस्तेमाल किया जा सकता है के बाद, यहाँ यूटीसी के लिए दिए गए समय क्षेत्र से किसी भी ptime कन्वर्ट करने के लिए एक उपयोगिता समारोह है

ptime get_local_to_utc(const ptime& t, const time_zone_ptr& localtz){ 
    if(t.is_not_a_date_time()) return t; 
    local_date_time lt(t.date(), t.time_of_day(), localtz, local_date_time::NOT_DATE_TIME_ON_ERROR); 
    return lt.utc_time(); 
} 
संबंधित मुद्दे