2013-04-11 3 views
32

में टाइम_पॉइंट वर्ष, महीने, दिन, घंटा, मिनट, सेकंड और मिलीसेकंडstd::chrono::time_point ऑब्जेक्ट से मैं कैसे निकाल सकता हूं?std :: chrono से वर्ष/महीना/दिन इत्यादि निकालें :: सी ++

मैंने केवल उदाहरणों को देखा कि कुल राशि कैसे निकालें। duration से सेकंड।

+0

[हो के संभावित डुप्लिकेट wd :: chrono :: time \ _point को कैलेंडर डेटाटाइम स्ट्रिंग को fractional सेकंड के साथ कनवर्ट करने के लिए?] (http://stackoverflow.com/questions/12835577/how-to-convert-stdchronotime-point-to-calendar-datetime- स्ट्रिंग-साथ-अंश) – Ali

उत्तर

48

आप केवल इस जानकारी को system_clock::time_point से निकाल सकते हैं। यह एकमात्र सिस्टम-आपूर्ति घड़ी है जिसका नागरिक कैलेंडर के साथ संबंध है।

system_clock::time_point now = system_clock::now(); 

फिर आप के साथ एक time_t को यह परिवर्तित कर सकते हैं: यहाँ कैसे इस घड़ी का उपयोग कर मौजूदा time_point पाने के लिए है

time_t tt = system_clock::to_time_t(now); 

सी पुस्तकालय का उपयोग करके आप तो एक एक tm को time_t में बदल सकते हैं, लेकिन आप का चयन करना होगा कि क्या आप उस रूपांतरण यूटीसी समय क्षेत्र में क्या करना चाहते हैं, या आप स्थानीय समय क्षेत्र:

tm utc_tm = *gmtime(&tt); 
tm local_tm = *localtime(&tt); 

तो आप ग बाहर टीएम के घटकों एक प्रिंट, उदाहरण के लिए:

std::cout << local_tm.tm_year + 1900 << '\n'; 
std::cout << local_tm.tm_mon + 1 << '\n'; 
std::cout << local_tm.tm_mday << '\n'; 

इसके अतिरिक्त

आप चाहते हैं, तो आप इस गैर गारंटी जानकारी का लाभ ले सकते:

system_clock मैं का हर कार्यान्वयन मुझे पता है कि unix time पर आधारित है। अर्थात। नए साल 1 9 70 यूटीसी के बाद सेकंड की संख्या, लीप सेकंड की उपेक्षा। और इस गिनती की सटीकता आमतौर पर सेकंड की तुलना में बेहतर होती है। यहाँ एक पूरा कार्यक्रम है जो सभी के लिए इस जानकारी का अर्क है:

#include <chrono> 
#include <ctime> 
#include <iostream> 

int 
main() 
{ 
    using namespace std; 
    using namespace std::chrono; 
    typedef duration<int, ratio_multiply<hours::period, ratio<24> >::type> days; 
    system_clock::time_point now = system_clock::now(); 
    system_clock::duration tp = now.time_since_epoch(); 
    days d = duration_cast<days>(tp); 
    tp -= d; 
    hours h = duration_cast<hours>(tp); 
    tp -= h; 
    minutes m = duration_cast<minutes>(tp); 
    tp -= m; 
    seconds s = duration_cast<seconds>(tp); 
    tp -= s; 
    std::cout << d.count() << "d " << h.count() << ':' 
       << m.count() << ':' << s.count(); 
    std::cout << " " << tp.count() << "[" 
       << system_clock::duration::period::num << '/' 
       << system_clock::duration::period::den << "]\n"; 

    time_t tt = system_clock::to_time_t(now); 
    tm utc_tm = *gmtime(&tt); 
    tm local_tm = *localtime(&tt); 
    std::cout << utc_tm.tm_year + 1900 << '-'; 
    std::cout << utc_tm.tm_mon + 1 << '-'; 
    std::cout << utc_tm.tm_mday << ' '; 
    std::cout << utc_tm.tm_hour << ':'; 
    std::cout << utc_tm.tm_min << ':'; 
    std::cout << utc_tm.tm_sec << '\n'; 
} 

यह एक कस्टम बनाने के लिए उपयोगी है duration दिनों मॉडल करने के लिए:

typedef duration<int, ratio_multiply<hours::period, ratio<24> >::type> days; 

अब आप समय अवधि के बाद, के रूप में प्राप्त कर सकते हैं एक सटीक ठीक के रूप में यह प्रबंधन कर सकते हैं, के साथ:

system_clock::duration tp = now.time_since_epoch(); 

तब दिनों के लिए यह छोटा कर देते, और कहा कि बंद घटाना।

फिर इसे घंटों तक छोटा करें, और इसे घटाएं।

तब तक जारी रखें जब तक आप सेकंड को घटा नहीं लेते।

आपको जो छोड़ा गया है वह system_clock::duration की इकाइयों के साथ एक सेकंड का अंश है। तो दिखाए गए अनुसार उस रन टाइम मान और उस मान की संकलन समय इकाइयों को प्रिंट करें।

मेरे लिए इस कार्यक्रम के बाहर प्रिंट:

15806d 20:31:14 598155[1/1000000] 
2013-4-11 20:31:14 

मेरे उत्पादन इंगित करता है system_clock::duration परिशुद्धता माइक्रोसेकंड है।यदि आप चाहें, उस के साथ मिलीसेकेंड तक छोटा कर दिया जा सकता है:

milliseconds ms = duration_cast<milliseconds>(tp); 

अद्यतन

This header-only C++11/14 library काम समाहित ऊपर, नीचे करने के लिए ग्राहक के काम को कम करने: मेरे लिए

#include "date.h" 
#include <iostream> 

int 
main() 
{ 
    // Reduce verbosity but let you know what is in what namespace 
    namespace C = std::chrono; 
    namespace D = date; 
    namespace S = std; 

    auto tp = C::system_clock::now(); // tp is a C::system_clock::time_point 
    { 
     // Need to reach into namespace date for this streaming operator 
     using namespace date; 
     S::cout << tp << '\n'; 
    } 
    auto dp = D::floor<D::days>(tp); // dp is a sys_days, which is a 
             // type alias for a C::time_point 
    auto ymd = D::year_month_day{dp}; 
    auto time = D::make_time(C::duration_cast<C::milliseconds>(tp-dp)); 
    S::cout << "year  = " << ymd.year() << '\n'; 
    S::cout << "month  = " << ymd.month() << '\n'; 
    S::cout << "day   = " << ymd.day() << '\n'; 
    S::cout << "hour  = " << time.hours().count() << "h\n"; 
    S::cout << "minute  = " << time.minutes().count() << "min\n"; 
    S::cout << "second  = " << time.seconds().count() << "s\n"; 
    S::cout << "millisecond = " << time.subseconds().count() << "ms\n"; 
} 

कौन सा सिर्फ उत्पादन:

2015-07-10 20:10:36.023017 
year  = 2015 
month  = Jul 
day   = 10 
hour  = 20h 
minute  = 10min 
second  = 36s 
millisecond = 23ms 
+0

'tm' के साथ समस्या यह है कि इसमें मिलीसेकंद परिशुद्धता नहीं है, जो मुझे चाहिए। – bytecode77

+0

@ डेविल्स चाइल्ड: उस स्थिति में, आप परिणामी time_t को system_clock :: time_point पर 'from_time_t' का उपयोग करके परिवर्तित कर सकते हैं। और फिर दो घटाएं। आपको एक अवधि प्राप्त करनी चाहिए जिसमें अंशकालिक सेकेंड हों, जिन्हें आप आगे बढ़ा सकते हैं। –

+0

धन्यवाद। मैं आपके समाधान के साथ जाऊंगा :) – bytecode77

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