2011-03-24 11 views
6

मैं एक पॉइंट ऑब्जेक्ट में दिनांक स्ट्रिंग (ट्विटर एपीआई से प्राप्त) को पार्स करने के लिए boost :: date_time का उपयोग करने का प्रयास कर रहा हूं। दिनांक स्वरूप का एक उदाहरण है:वर्ष वैध सीमा से बाहर है: 1400 ... 10000

Thu Mar 24 16:12:42 +0000 2011 

कोई फर्क नहीं पड़ता कि मैं क्या हालांकि करते हैं, मैं एक स्ट्रिंग पार्स करने का प्रयास करते समय अपवाद "वर्ष मान्य सीमा से बाहर है" मिलता है। दिनांक स्वरूप मेरे लिए सही लगती है, यहाँ कोड है:

boost::posix_time::ptime created_time; 
std::stringstream ss(created_string); 
ss.exceptions(std::ios_base::failbit); //Turn on exceptions 
ss.imbue(std::locale(ss.getloc(), new boost::posix_time::time_input_facet("%a %b %d %T %q %Y"))); 
ss >> created_time; 

उपरोक्त कोड में "created_string" ऊपर तिथि है। क्या मैंने प्रारूप स्ट्रिंग में गलती की है?

+1

एक बात निश्चित है, आप 'new' एक समारोह कॉल के अंदर का उपयोग करके एक स्मृति रिसाव बना लिया है। क्या आप जावा या सी # के साथ अधिक अनुभवी हैं? –

+0

हाँ चिंता न करें मुझे इसके बारे में पता है, मैं इसे काम करने के लिए कोशिश कर रहे कोड को पुन: व्यवस्थित कर रहा हूं, जब मुझे तारीख पार्सिंग मिलती है तो मैं इसे ठीक कर दूंगा :) संपादित करें: असल में, मुझे नहीं लगता परिणामस्वरूप रिसाव होता है ... time_input_facet को तब तक refcounted किया जाता है जब तक आप दूसरे वैकल्पिक कन्स्ट्रक्टर तर्क के रूप में 1 पास नहीं करते। – Kazade

+2

हाँ, मैंने अभी चेक किया है, जब लोकेल नष्ट हो जाता है तो स्टैक परिणामों पर एक टाइम_इनपुट_फैसेट पर पॉइंटर पास करना (जब तक कि आप कन्स्ट्रक्टर को 1 पास न करें जो refcounting को अक्षम करता है)। तो उपर्युक्त कोड रिसाव नहीं करता है (भले ही ऐसा लगता है :) :) – Kazade

उत्तर

4

%T और %q दोनों आउटपुट-ऑनलाइन प्रारूप झंडे हैं।

यह प्रदर्शित करने के लिए, अपना प्रारूप "%a %b %d %H:%M:%S +0000 %Y" पर बदलें और आपका प्रोग्राम वर्णित के रूप में चलाएगा।

समय क्षेत्र इनपुट के लिए, यह थोड़ा अधिक जटिल है, आपको स्ट्रिंग को पूर्व-प्रक्रिया को +0000 से posix time zone format बदलने के लिए पहले से संसाधित करना पड़ सकता है।

संपादित करें: उदाहरण के लिए यदि आप इसे इस तरह से कर सकता है:

#include <iostream> 
#include <sstream> 
#include <boost/date_time.hpp> 
int main() 
{ 
     //std::string created_string = "Thu Mar 24 16:12:42 +0000 2011"; 
     // write your own function to search and replace +0000 with GMT+00:00 
     std::string created_string = "Thu Mar 24 16:12:42 GMT+00:00 2011"; 

     boost::local_time::local_date_time created_time(boost::local_time::not_a_date_time); 
     std::stringstream ss(created_string); 
     ss.exceptions(std::ios_base::failbit); 
     ss.imbue(std::locale(ss.getloc(), 
       new boost::local_time::local_time_input_facet("%a %b %d %H:%M:%S %ZP %Y"))); 
     ss >> created_time; 
     std::cout << created_time << '\n'; 
} 
+0

धन्यवाद, आम तौर पर मैं% H:% M:% S और +0000 दोनों के साथ व्यक्तिगत रूप से प्रयास करता था, लेकिन एक ही समय में नहीं! धन्यवाद! – Kazade

3

docs के अनुसार, %T इस समय इनपुट के लिए उपयोग योग्य नहीं है क्योंकि इसके बाद चार्ट में ! है। मैं अभी इसका परीक्षण नहीं कर सकता, लेकिन मुझे संदेह है कि आपकी समस्या है।

संपादित करें:

%q भी एक निर्गम केवल ध्वज के रूप में नीचे टिप्पणी में बताया है।

+0

मुझे वही त्रुटि मिलती है, भले ही मैं% H को% H से बदलता हूं:% M:% S :( – Kazade

+0

@ Kazade, '% q' वर्णन में "आउटपुट केवल" होने के लिए भी कहा जाता है। मुझे संदेह है कि यह वास्तविक समस्या है। –

+0

हाँ, मैं बस '% q' पर भी टिप्पणी करने जा रहा था। इसमें अच्छा छोटा' '' नहीं है इसे तुरंत स्पष्ट करें :) –

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