2016-06-02 5 views
0

Danke an Leute, die dazu beigetragen haben, question.C++ Boost Posix Zeit schlägt fehl Parsing

Ich habe ein bisschen Hack gemacht, um eine Zeichenfolge in epochale Zeit mit einem flexiblen benutzerdefinierten Format zu konvertieren.

Ich verstehe nicht, warum mein Format "%m/%d/%Y %H:%M:%S" schlägt fehl, aber das andere %Y/%m/%d %H:%M:%S funktioniert. Wie soll ich es beheben?

#include <iostream> 
#include <boost/date_time.hpp> 
namespace bt = boost::posix_time; 

std::time_t pt_to_time_t(const bt::ptime& pt) 
{ 
    bt::ptime timet_start(boost::gregorian::date(1970,1,1)); 
    bt::time_duration diff = pt - timet_start; 
    return diff.ticks()/bt::time_duration::rep_type::ticks_per_second; 
} 
void seconds_from_epoch(const std::string& s,const std::string format_string) 
{ 
    const std::locale format = std::locale(std::locale::classic(),new bt::time_input_facet(format_string)); 
    bt::ptime pt; 
    std::istringstream is(s); 
    is.imbue(format); 
    is >> pt; 
    // if(pt != bt::ptime()) 
    //  break; 
    std::cout << " ptime is " << pt << '\n'; 
    std::cout << " seconds from epoch are " << pt_to_time_t(pt) << '\n'; 
} 
int main() 
{ 
    seconds_from_epoch("7/23/2012 4:10:43","%m/%d/%Y %H:%M:%S"); 
    seconds_from_epoch("2004/03/21 12:45:33","%Y/%m/%d %H:%M:%S"); 
} 

Ergebnisse:

g++ main.cpp -Wall -Wconversion -Wfatal-errors -Wextra -std=c++11 -o main 
./main 
ptime is not-a-date-time 
seconds from epoch are 9223372036854 
ptime is 2004-Mar-21 12:45:33 
seconds from epoch are 1079873133 

Antwort

0

Zitat aus doc:

% H Die Stunde als Dezimalzahl eine 24-Stunden-Uhr (00 bis 23) verwendet wird.

So ändern Sie die Zeile

seconds_from_epoch("7/23/2012 4:10:43","%m/%d/%Y %H:%M:%S"); 

zu

seconds_from_epoch("7/23/2012 04:10:43","%m/%d/%Y %H:%M:%S"); // 4:10 => 04:10 

Dann funktioniert es.

[Update:] Das Problem hier bezieht sich nicht auf die Reihenfolge der Formatbezeichner, aber der gültige Wert %H sollte im Bereich 00 bis 23 sein.

+0

danke, aber was, wenn ich nicht die erste Schnur ändern möchte ?? wie man es durch Ändern des restlichen Codes beheben kann? – ar2015

+0

Was meinen Sie mit "den Rest des Codes ändern"? Das Problem hängt nicht von der Reihenfolge ab, in der das Format angegeben wird, aber der Wert des Attributs "% H" sollte im Bereich "00" bis "23" liegen. – Mine

+0

Aber der Benutzer mag die Stunde auch mit einer Ziffer geben. z.B. '4'. Ich kann sie nicht zwingen, "04" einzugeben. – ar2015

0

Wenn Sie in Ihrer Date-Bibliothek flexibel sind, können Sie this one verwenden. Dies würde Ihr Beispiel so aussehen, wie:

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

void 
seconds_from_epoch(const std::string& s,const std::string format_string) 
{ 
    std::istringstream is(s); 
    is.exceptions(std::ios::failbit); 
    date::sys_seconds pt; 
    date::parse(is, format_string, pt); 
    using namespace date; 
    std::cout << " ptime is " << pt << '\n'; 
    std::cout << " seconds from epoch are " << pt.time_since_epoch().count() << '\n'; 
} 

int 
main() 
{ 
    seconds_from_epoch("7/23/2012 4:10:43","%m/%d/%Y %H:%M:%S"); 
    seconds_from_epoch("2004/03/21 12:45:33","%Y/%m/%d %H:%M:%S"); 
} 

ptime is 2012-07-23 04:10:43 
seconds from epoch are 1343016643 
ptime is 2004-03-21 12:45:33 
seconds from epoch are 1079873133 

Dies würde ermöglicht es Ihnen, in dem C++ <chrono> Zeitsystem zu arbeiten.