2010-04-10 14 views
12

Se eseguo il comando date +%H-%M-%S sulla riga di comando (Debian/Lenny), viene stampato un tempo di utilizzo (non UTC, non DST-less, la volta in cui una persona normale ha il proprio orologio da polso).Il modo più semplice per ottenere l'ora corrente nel fuso orario corrente usando boost :: date_time?

Qual è il modo più semplice per ottenere la stessa cosa con boost::date_time?

Se faccio questo:

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; 

Poi msg.str() è un'ora prima rispetto al tempo che voglio vedere. Non sono sicuro se questo è dovuto al fatto che sta visualizzando l'ora UTC o il fuso orario locale senza una correzione dell'ora legale (sono nel Regno Unito).

Qual è il modo più semplice per modificare quanto sopra per ottenere il fuso orario locale dell'ora legale corretto? Ho un'idea che riguarda lo boost::date_time:: c_local_adjustor ma non riesco a capirlo dagli esempi.

+2

Credo che questo sia un duplicato di http://stackoverflow.com/questions/2492775/get-local-time-with-boost/2493977. Versione breve: usa 'boost :: posix_time' per costruire un oggetto orario dall'orologio di sistema. Questo funziona alla grande per l'ora locale (il locale 'C'). Se puoi costruire tempi per altri fusi orari dipende da quali locali hai a disposizione. – Nate

+0

Grazie per il puntatore; il problema fondamentale è che non avevo davvero apprezzato la differenza tra local_time/posix_time. – timday

risposta

17

Questo fa quello che voglio:

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

Ha detto un modo semplice. Non esiste un modo semplice con la data/ora Boost. Hanno astratto e generalizzato * troppo. * –

+3

Penso che sia un po 'duro (anche se non del tutto ingiustificato). Quanto sopra è abbastanza semplice (anche se dettagliato con tutti i namespaces). Il problema è spesso più la documentazione ti sta dicendo come arrivare ad Alpha Centauri quando volevi solo girare intorno all'isolato. D'altra parte, volevo fare la stessa cosa in Python qualche tempo fa, e questo non aveva bisogno di un post su StackOverflow per funzionare. – timday

+1

non iniziare la mia prima esperienza con il "tempo di posa" di boost e quanto sia stato facile ottenere un timestamp di POSIX e quanto errato! con quello detto saremmo tutti persi senza Boost –

4

Anche se questo non sta usando boost :: DATE_TIME è relativamente facile con boost :: locale, che è molto più adatto per questo compito. Poiché il tuo bisogno è semplicemente ottenere un tempo formattato dalle impostazioni locali correnti.

IMHO boost :: date_time deve essere utilizzato quando si ha a che fare con software come calcoli di gantt/pianificazione, se si dispone di molto aritmetica data_time. Ma semplicemente per usare il tempo e fare un po 'di aritmetica su di esso, avrai un successo più veloce con boost :: locale.

#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; 
} 

In questo momento dovrebbe produrre: 15-45-48. :)

Problemi correlati