2014-10-23 13 views
10

में मिलीसेकंद दिनांक समय का विश्लेषण करने का सबसे अच्छा तरीका क्या है जब हमारे पास मिलीसेसेकंड के साथ डेटाटाइम स्ट्रिंग है तो strptime के लिए अगली सबसे अच्छी बात क्या होगी?सी ++ 11

को देखते हुए:

"30/03/09 16:31:32.121" 

हम नियमित रूप से strptime उपयोग नहीं कर सकते क्योंकि struct tm millisseconds दुकान नहीं है। क्या कोई नई कक्षा है जो इसे प्राप्त कर सकती है?

+0

['std :: get_time'] (http://en.cppreference.com/w/cpp/io/manip/get_time) सी ++ 11 है लेकिन दर्पण 'स्ट्रिप्टाइम' विनिर्देशन है। क्या आपको मिलीसेकंड स्टोर करने की ज़रूरत है, या क्या आपको इसे प्रदर्शित करने की आवश्यकता है? –

+0

मेरा लक्ष्य इस तारीख के समय को क्रोनो टाइमपॉइंट में संग्रहीत करना है, इसलिए मुझे इसे पार्स और संग्रहीत करने की आवश्यकता है। – Nezquick

+0

.1214 के साथ आप मिलीसेकंड नहीं मांग रहे हैं, लेकिन 1/10 मिलीसेकंड, या 100 माइक्रोसॉन्ड के लिए। –

उत्तर

6

मैं इन क्षेत्रों मैन्युअल रूप से (पूर्णांक में पढ़ रहे हैं और सेकंड के लिए डबल) पार्स होगा, तो days_from_civil का उपयोग में वर्ष/माह/दिन कन्वर्ट करने के लिए एक chrono::system_clock::time_point:

std::chrono::system_clock::time_point t(days(days_from_civil(y, m, d))); 

जहां days है:

using days = std::chrono::duration<int, std::ratio<86400>>; 

फिर आप उस घंटों, मिनटों और सेकंड में जोड़ सकते हैं। आंशिक सेकंड संभाल करने के लिए आप एक मामूली नृत्य करने की आवश्यकता होगी:

double s; 
your_stream >> s; // 32.121 
using namespace std::chrono; 
duration<double> dsecs(s); 
seconds sec = duration_cast<seconds>(dsecs); 
milliseconds ms = duration_cast<milliseconds>(dsecs - sec); 
t += sec + ms; 

यदि आप चाहें, तो अपने मिलीसेकेंड रूपांतरण के लिए round from here का उपयोग करें:

milliseconds ms = round<milliseconds>(dsecs - sec); 

duration_cast शून्य की ओर काटना है। अन्य गोलाकार मोड हैं: फर्श, गोल, छत, at this link

इसे आसानी से पुन: उपयोग के लिए एक साफ समारोह में लपेटें। :-)

उपरोक्त कोड सभी यूटीसी मानते हैं। यदि आपकी दिनांक/समय जिसे आप पार्सिंग कर रहे हैं उसे यूटीसी से ऑफसेट करने के लिए जाना जाता है, तो आप उस ऑफसेट को जोड़/घटा सकते हैं। system_clock ट्रैक Unix time के सभी ज्ञात कार्यान्वयन, जो यूटीसी समय क्षेत्र में 1 9 70-01-01 के बाद से सेकंड है।

अद्यतन

इस जवाब मैं एक more general library कि ओपी उस समय की मांग कर लग रहा था विकसित किया है लेखन के बाद से।

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

int 
main() 
{ 
    std::istringstream in{"30/03/09 16:31:32.121\n" 
          "30/03/09 16:31:32.1214"}; 
    std::chrono::system_clock::time_point tp; 
    in >> date::parse("%d/%m/%y %T", tp); 
    using namespace date; 
    std::cout << tp << '\n'; 
    in >> date::parse(" %d/%m/%y %T", tp); 
    std::cout << tp << '\n'; 
} 

यह आउटपुट:: यह सीधे एक std::chrono::system_clock::time_point इस तरह में उप दूसरा precisions की एक विस्तृत विविधता पार्स कर सकते हैं

2009-03-30 16:31:32.121000 
2009-03-30 16:31:32.121400 

इस पुस्तकालय के रूप में मैं मूल रूप से वर्णित एक ही तकनीक और उपकरण का उपयोग करता है, लेकिन पैक किया जाता है ऊपर और एक हेडर लाइब्रेरी के रूप में जाने के लिए तैयार है।

+0

दिनों_from_civil (अभी तक एक और बाहरी lib) का उपयोग करने के बजाय मैंने नियमित समय_टी का उपयोग किया है ताकि मैं तारीख का हिस्सा काम कर सकूं :) मैं Google का उपयोग कर समाप्त हुआ: re2 पैटर्न को पढ़ने के बाद से मैं चाहता था कुछ और अधिक सामान्य। धन्यवाद – Nezquick