2010-04-10 20 views
12

Si hago date +%H-%M-%S en la línea de comando (Debian/Lenny), obtengo un tiempo fácil de usar (no UTC, no DST-less, el tiempo que una persona normal tiene en su reloj de pulsera).¿La forma más simple de obtener la hora actual en la zona horaria actual usando boost :: date_time?

¿Cuál es la forma más sencilla de obtener lo mismo con boost::date_time?

Si hago esto:

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; 

Entonces msg.str() es una hora antes de la hora que quiero ver. No estoy seguro de si esto se debe a que muestra el horario UTC o la zona horaria local sin una corrección DST (estoy en el Reino Unido).

¿Cuál es la forma más sencilla de modificar lo anterior para obtener el tiempo horario local corregido de DST? Tengo una idea de que implica boost::date_time:: c_local_adjustor pero no puedo entenderlo a partir de los ejemplos.

+2

Creo que este es un duplicado de http://stackoverflow.com/questions/2492775/get-local-time-with-boost/2493977. Versión corta: use 'boost :: posix_time' para construir un objeto de hora a partir del reloj del sistema. Esto funciona muy bien para la hora local (la configuración regional 'C'). Si puede construir tiempos para otras zonas horarias depende de las configuraciones regionales que tenga disponibles. – Nate

+0

Gracias por el puntero; El problema fundamental es que realmente no había apreciado la diferencia entre local_time/posix_time. – timday

Respuesta

17

Esto hace lo que yo quiero:

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

Dijo de una manera simple. No hay una manera simple con la fecha/hora de Boost. Se abstrajeron y generalizaron demasiado. * –

+3

Creo que es un poco duro (aunque no completamente injustificado). Lo anterior es lo suficientemente simple (aunque prolijo con todo el espacio de nombres). El problema a menudo es más, la documentación te dice cómo llegar a Alpha Centauri cuando solo querías caminar alrededor de la cuadra. Por otro lado, quería hacer lo mismo en Python hace un tiempo, y eso no necesitaba una publicación en StackOverflow para funcionar. – timday

+1

¡no me hagas comenzar con mi primera experiencia con el 'tiempo de posposición' de boost y lo fácil que pensé que sería obtener una marca de tiempo POSIX y lo equivocado que estaba! Dicho esto, todos estaríamos perdidos sin Boost –

4

Si bien esto no está utilizando impulso :: DATE_TIME que es relativamente fácil con impulso :: local, que es bastante más adecuado para esta tarea. Como su necesidad es simplemente obtener un tiempo formateado de la configuración regional actual.

IMHO boost :: date_time se debe utilizar cuando se trata de softwares como cálculos de Gantt/planificación, si tiene una gran cantidad de aritmética date_time. Pero simplemente por usar el tiempo y hacer algo de aritmética en él, tendrá un éxito más rápido 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; 
} 

En este momento debería salir: 15-45-48. :)

Cuestiones relacionadas