2010-04-10 4 views
12

Wenn ich date +%H-%M-%S auf der Kommandozeile (Debian/Lenny) zu tun, erhalte ich eine benutzerfreundliche (nicht UTC, nicht DST-less, die Zeit, eine normale Person auf ihrer Armbanduhr hat) Zeit gedruckt.Einfachste Möglichkeit, aktuelle Zeit in der aktuellen Zeitzone mit boost :: date_time zu erhalten?

Was ist der einfachste Weg, um die gleiche Sache mit boost::date_time zu erhalten?

Wenn ich dies tun:

std::ostringstream msg; 

boost::local_time::local_date_time t = 
    boost::local_time::local_sec_clock::local_time(
    boost::local_time::time_zone_ptr() 
); 

boost::local_time::local_time_facet* lf(
    new boost::local_time::local_time_facet("%H-%M-%S") 
); 

msg.imbue(std::locale(msg.getloc(),lf)); 
msg << t; 

Dann msg.str() eine Stunde früher als die Zeit, die ich sehen will. Ich bin mir nicht sicher, ob dies ist, weil es UTC oder lokale Zeitzonezeit ohne eine DST-Korrektur zeigt (ich bin in Großbritannien).

Was ist der einfachste Weg, um die oben zu ändern die DST lokale Zeitzone Zeit korrigiert zu erhalten? Ich habe eine Idee, es beinhaltet boost::date_time:: c_local_adjustor, aber kann es nicht aus den Beispielen herausfinden.

+2

Ich glaube, dies ist ein Duplikat http://stackoverflow.com/questions/2492775/get-local-time-with-boost/2493977 ist. Kurzversion: Verwenden Sie 'boost :: posix_time', um ein Zeitobjekt aus der Systemuhr zu konstruieren. Dies funktioniert gut für die lokale Zeit (das 'C' locale). Ob Sie Zeiten für andere Zeitzonen erstellen können, hängt davon ab, welche Gebietsschemas Ihnen zur Verfügung stehen. – Nate

+0

Danke für den Zeiger; Grundlegendes Problem ist, dass ich den Unterschied zwischen local_time/posix_time nicht wirklich geschätzt habe. – timday

Antwort

17

Das tut, was ich will:

namespace pt = boost::posix_time; 
    std::ostringstream msg; 
    const pt::ptime now = pt::second_clock::local_time(); 
    pt::time_facet*const f = new pt::time_facet("%H-%M-%S"); 
    msg.imbue(std::locale(msg.getloc(),f)); 
    msg << now; 
+15

Er sagte einen einfachen Weg. Es gibt keinen einfachen Weg mit Boost Datum/Uhrzeit. Sie abstrahiert und generalisiert * zu viel. * –

+3

Ich denke, das ist ein wenig hart (wenn auch nicht völlig ungerechtfertigt). Das obige ist einfach genug (obwohl es mit dem gesamten Namensraum ausführlich ist). Das Problem ist oft mehr die Dokumentation sagt Ihnen, wie Sie zu Alpha Centauri gelangen, wenn Sie nur um den Block gehen wollten. Auf der anderen Seite wollte ich vor einiger Zeit dasselbe in Python machen, und das brauchte keinen Post in StackOverflow, um das zu erreichen. – timday

+1

Versteh mich auf meine erste Erfahrung mit Auftrieb des ‚Posix Zeit‘ und wie einfach ich dachte, es wäre zu bekommen eine POSIX-Zeitstempel aus ihm heraus und wie falsch war nicht gestartet ich! Damit wären wir alle ohne Boost verloren gegangen. –

4

Während dies nicht boost ist :: DATE_TIME es relativ einfach ist, mit boost :: locale, die ziemlich mehr für diese Aufgabe angepasst ist. Sie benötigen lediglich eine formatierte Zeit vom aktuellen Gebietsschema.

IMHO boost :: date_time verwendet werden sollten, wenn Sie mit Software wie Gantt/Planung Berechnungen beschäftigen, wurden, haben Sie eine Menge date_time Arithmetik. Aber um Zeit zu nutzen und etwas Arithmetik zu verwenden, werden Sie mit boost :: locale schneller Erfolg haben.

#include <iostream> 
#include <boost/locale.hpp> 

using namespace boost; 

int main(int argc, char **argv) { 
    locale::generator gen; 
    std::locale::global(gen("")); 

    locale::date_time now; 
    std::cout.imbue(std::locale());  
    std::cout << locale::as::ftime("%H-%M-%S") << now << std::endl; 

    return 0; 
} 

Im Moment sollte es ausgeben: 15-45-48. :)

Verwandte Themen