2010-04-10 8 views
12

यदि मैं कमांडलाइन (डेबियन/लेनी) पर date +%H-%M-%S करता हूं, तो मुझे उपयोगकर्ता के अनुकूल (यूटीसी नहीं, डीएसटी-कम नहीं, एक सामान्य व्यक्ति को उनके कलाई घड़ी पर समय मिलता है) समय मुद्रित होता है।बूस्ट :: date_time का उपयोग कर वर्तमान समय क्षेत्र में वर्तमान समय प्राप्त करने का सबसे आसान तरीका?

boost::date_time के साथ एक ही चीज़ प्राप्त करने का सबसे आसान तरीका क्या है?

अगर मैं ऐसा करते हैं:

std::ostringstream msg; 

boost::local_time::local_date_time t = 
    boost::local_time::local_sec_clock::local_time(
    boost::local_time::time_zone_ptr() 
); 

boost::local_time::local_time_facet* lf(
    new boost::local_time::local_time_facet("%H-%M-%S") 
); 

msg.imbue(std::locale(msg.getloc(),lf)); 
msg << t; 

फिर msg.str() एक घंटे समय मैं देखना चाहता हूँ से पहले है। मुझे यकीन नहीं है कि ऐसा इसलिए है क्योंकि यह डीटीएस सुधार के बिना यूटीसी या स्थानीय टाइमज़ोन समय दिखा रहा है (मैं यूके में हूं)।

डीएसटी सही स्थानीय टाइमज़ोन समय को उपज करने के लिए ऊपर संशोधित करने का सबसे आसान तरीका क्या है? मुझे एक विचार है कि इसमें boost::date_time:: c_local_adjustor शामिल है लेकिन उदाहरणों से इसे समझ नहीं सकता है।

+2

मेरा मानना ​​है कि यह http://stackoverflow.com/questions/2492775/get-local-time-with-boost/2493977 का डुप्लिकेट है। लघु संस्करण: सिस्टम घड़ी से समय ऑब्जेक्ट बनाने के लिए 'boost :: posix_time' का उपयोग करें। यह स्थानीय समय ('सी 'लोकेल) के लिए बहुत अच्छा काम करता है। चाहे आप अन्य समय क्षेत्रों के लिए समय बना सकते हैं, आपके द्वारा उपलब्ध स्थानीय स्थानों पर निर्भर करता है। – Nate

+0

सूचक के लिए धन्यवाद; मौलिक समस्या यह है कि मैंने वास्तव में local_time/posix_time के बीच अंतर की सराहना नहीं की थी। – timday

उत्तर

17

यह करता है जो मैं चाहता:

namespace pt = boost::posix_time; 
    std::ostringstream msg; 
    const pt::ptime now = pt::second_clock::local_time(); 
    pt::time_facet*const f = new pt::time_facet("%H-%M-%S"); 
    msg.imbue(std::locale(msg.getloc(),f)); 
    msg << now; 
+15

उन्होंने एक आसान तरीका कहा। बूस्ट दिनांक/समय के साथ कोई आसान तरीका नहीं है। उन्होंने सारणीबद्ध और सामान्यीकृत * बहुत अधिक। * –

+3

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

+1

मुझे बूस्ट के 'पॉजिक्स टाइम' के साथ अपने पहले अनुभव पर शुरू नहीं किया है और मैंने सोचा कि यह कितना आसान होगा कि यह पॉज़िक्स टाइम स्टैंप से बाहर निकलना होगा और मैं कितना गलत था! इसके साथ ही हम सभी बूस्ट –

4

हालांकि इस बढ़ावा का उपयोग नहीं कर रहा है :: DATE_TIME यह बढ़ावा :: स्थान, जो काफी अधिक इस कार्य के लिए अनुकूलित है के साथ अपेक्षाकृत आसान है। चूंकि आपकी ज़रूरत सिर्फ वर्तमान लोकेल से स्वरूपित समय प्राप्त कर रही है।

आईएमएचओ बूस्ट :: डेट_टाइम का उपयोग तब किया जाना चाहिए जब आप सॉफ़्टवेयर जैसे गैंट/प्लानिंग कंप्यूटेशंस से निपटें, क्या आपके पास डेट_टाइम अंकगणित बहुत कुछ था। लेकिन बस समय का उपयोग करने और उस पर कुछ अंकगणित करने के लिए, आप बूस्ट :: लोकेल के साथ तेजी से सफलता प्राप्त करेंगे।

#include <iostream> 
#include <boost/locale.hpp> 

using namespace boost; 

int main(int argc, char **argv) { 
    locale::generator gen; 
    std::locale::global(gen("")); 

    locale::date_time now; 
    std::cout.imbue(std::locale());  
    std::cout << locale::as::ftime("%H-%M-%S") << now << std::endl; 

    return 0; 
} 

अभी यह आउटपुट होना चाहिए: 15-45-48। :)

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