2010-08-04 14 views
5

मैं एक सी ++ ऐप लिख रहा हूं जिसे दिनांक/समय स्ट्रिंग को पार्स करना और युग का समय देना है। लेकिन दिनांक/समय स्ट्रिंग के प्रारूप एक से अधिक हो सकता है (वास्तव में कहते हैं कि 25 प्रारूपों)सी ++ में दिनांक/समय पार्सिंग (एपोक के लिए कोई प्रारूप स्ट्रिंग)

"EEE, dd MMM yyyy HH:mm:ss '('ZZZ')'", 
    "EEE, dd MMM yyyy HH:mm:ss '\"'ZZZ'\"'", 
    "EEE, dd MMM yyyy hh:mm:ss z", 
    "EEE, dd MMM yyyy HH:mm Z", 
    "EEE, dd MMM yyyy HH:mm:ss", 
    "EEE, MMM dd, yyyy 'at' HH:mm:ss z", 
    "EEE M/dd/yyyy hh:mm:ss a", 
    "EEE MMM dd HH:mm:ss z yyyy", 
    "EEE MMM dd hh:mm:ss yyyy", 
    "EEEE, MMMM dd, yyyy hh:mm:ss a", 
    "EEEE, MMMM dd, yyyy HH:mm a", 
    "EEEE, MMMM dd, yyyy HH:mm", 
    "MMM dd, yyyy hh:mm:ss a", 
    "dd MMM yyyy hh:mm:ss z", 
    "dd-MMM-yyyy HH:mm:ss z", 
    "dd MMM yy HH:mm:ss", 
    "MM/dd/yyyy hh:mm a (EEEE)", 
    "MM/dd/yyyy hh:mm a (EEEE)", 
    "MM/dd/yyyy hh:mm:ss", 
    "MM/dd/yyyy hh:mm a Z", 
    "MM/dd/yyyy hh:mma Z", 
    "MM/dd/yyyy hh:mma", 
    "MM/dd/yyyy hh:mm a", 
    "MM/dd/yyyy hh:mm Z", 
    "MM/dd/yy hh:mm a Z", 
    "MM/dd/yy hh:mma Z", 
    "MM/dd/yy HH:mm a", 
    "MM/dd/yy HH:mm Z", 
    "MM/dd/yyyy", 
    "yyyy-MM-dd HH:mm:ss", 
    "yyyyMMddhhmmss", 
    "yyyyMMddhhmm", 
    "yyyyMMdd" 

की तरह अब, मैं स्ट्रिंग लेने के लिए, यह पता लगाने में यह जो इन स्वरूपों में से है, तो मिल के अंतर्गत आता है की जरूरत है युग में समय।

क्या आप ऐसा करने का एक तरीका सुझा सकते हैं। कोड नमूने वास्तव में सहायक होंगे। मैं बूस्ट पुस्तकालयों पर बैंकिंग कर रहा हूं। अगर मुझे बढ़ावा तिथि/समय पार्सिंग पुस्तकालयों द्वारा हासिल किया जा सकता है तो मुझे बताएं।

अग्रिम धन्यवाद, ए जे

उत्तर

13

मैं तुम्हें इन स्वरूपों में से प्रत्येक का उपयोग कर ptime में अपने स्ट्रिंग बदलने और जो कि एक not_a_date_time में परिणाम नहीं लेने के लिए प्रयास कर सकता है लगता है:।

boost format flags हैं आपके से थोड़ा अलग, मैं इस उदाहरण के लिए केवल अंतिम पांच करूँगा:

#include <iostream> 
#include <boost/date_time/posix_time/posix_time.hpp> 
using boost::posix_time::time_input_facet; 
using std::locale; 
const locale inputs[] = { 
    locale(locale::classic(), new time_input_facet("%m/%d/%Y")), 
    locale(locale::classic(), new time_input_facet("%Y-%m-%d %H:%M:%S")), 
    locale(locale::classic(), new time_input_facet("%Y%m%d%H%M%S")), 
    locale(locale::classic(), new time_input_facet("%Y%m%d%H%M")), 
    locale(locale::classic(), new time_input_facet("%Y%m%d")) }; 
const size_t formats = sizeof(inputs)/sizeof(inputs[0]); 

time_t ptime_to_time_t(boost::posix_time::ptime t) 
{ 
     static boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1)); 
     return (t-epoch).ticks()/boost::posix_time::time_duration::ticks_per_second(); 
} 
int main() 
{ 
     std::string msg = "2010-08-04 08:34:12"; 

     for(size_t i=0; i<formats; ++i) 
     { 
      std::istringstream ss(msg); 
      ss.imbue(inputs[i]); 
      boost::posix_time::ptime this_time; 
      ss >> this_time; 

      if(this_time != boost::posix_time::not_a_date_time) 
       std::cout << this_time << " or " << ptime_to_time_t(this_time) << std::endl; 
     } 
} 
+0

बहुत समय लेने के लिए धन्यवाद कबी, मैं इसे आजमाउंगा और वापस आऊंगा। – AMM

+1

अब, ऐसा लगता है कि% d और% m के पास 2 अक्षर हैं, यानी .. यह 5 के बजाय 1 और 05 के बजाय 01 जैसा होना चाहिए। मैं उस मामले को कैसे संभाल सकता हूं। ऐसा लगता है कि मेरे लिए कोई समस्या हो रही है। प्रारूप झंडे को देखकर बहुत कुछ पता नहीं लगा सका। – AMM

+3

यदि आपके दिन और महीने एकल अंक हो सकते हैं, पूर्ववर्ती शून्य या स्थान के साथ, तो इनमें से कुछ प्रारूपों को अनजाने में पार्स नहीं किया जा सकता है। 'YyyyMmdd' के लिए, 2010111 2010-01-11 या 2010-11-01 होगा? किसी भी मामले में, अगर कुछ दिनांक_टाइम IO संभाल नहीं सकता है, तो हमेशा बढ़ावा मिलता है। स्पिरिट। – Cubbi

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