2010-02-19 16 views
11

¿Cómo puedo convertir entre hora local y hora UTC (en particular, desde local a UTC) usando boost::date_time usando un actual zona horaria del sistema? Sé acerca de boost::date_time::local_adjustor, pero requiere un argumento de plantilla que es un desplazamiento dependiente de la zona horaria.Cómo convertir entre hora local y universal usando boost :: date_time?

Failing platform-independent way para hacer eso, ¿cómo lo haría específicamente en Linux?

Como un lado, ¿cómo se manejan puntos de tiempo inexistentes durante la conversión? Por ejemplo, si un día es de una hora corto debido al horario de verano e intento convertir un punto de tiempo de la hora que falta, ¿cuál será el tiempo universal resultante?

Respuesta

7

estoy usando siguiente código para encontrar la diferencia entre la hora local y UTC:


    using namespace boost::posix_time; 
    using namespace boost::gregorian; 

    time_duration UTC_Diff; 
    { 
     ptime someUTC_Time(date(2008, Jan, 1), time_duration(0, 0, 0, 0)); 
     ptime someLocalTime = boost::date_time::c_local_adjustor::utc_to_local(someUTC_Time); 
     UTC_Diff = someLocalTime - someUTC_Time; 
    } 

Desde que encuentre la diferencia is't fácil calcutate hora UTC.

+0

Funciona, pero desafortunadamente solo de una manera, y no puedo usar el desplazamiento calculado, ya que DST lo hace diferente para diferentes fechas. –

4

La conversión entre UTC y local en función de una diferencia entre algunos horarios elegidos y UTC solo funciona siempre que permanezca en el mismo lado del momento de cambio del horario de verano.

El siguiente funcionará para cualquier fecha (lo siento no es local-> UTC):

bpt::ptime utils::utcToLocal(bpt::ptime utcTime) 
{ 
    // NOTE: the conversion functions between ptime and time_t/tm are broken so we do it ourselves. 
    bpt::time_duration timeSinceEpoch = utcTime - bpt::ptime(boost::gregorian::date(1970, 1, 1), bpt::time_duration(0,0,0)); 
    time_t secondsSinceEpoch = timeSinceEpoch.total_seconds(); 
    tm* localAsTm = localtime(&secondsSinceEpoch); 
    return bpt::ptime(
    boost::gregorian::date(
     localAsTm->tm_year + 1900, 
     localAsTm->tm_mon + 1, 
     localAsTm->tm_mday), 
    bpt::time_duration(
     localAsTm->tm_hour, 
     localAsTm->tm_min, 
     localAsTm->tm_sec)); 
} 
5

Si usted tiene un local_date_time en el huso horario correcto, puede utilizar directamente utc_time método para obtener la hora en UTC.

miradas mirar usted tiene alguna ptime llano, que desea interpretar como miembros de un huso horario determinado y luego convertirlo a UTC para eso, estoy usando este constructor

local_date_time(...) 
    Parameters: 
    date 
    time_duration 
    time_zone_ptr 
    bool 

Según docs reinterpreta dado datos de tiempo para estar en la zona horaria dado, significa que se puede utilizar para localizar cualquier ptime dado, y después de que utc_time método se puede utilizar, aquí es una función de utilidad para convertir cualquier ptime de una zona horaria dado a UTC

ptime get_local_to_utc(const ptime& t, const time_zone_ptr& localtz){ 
    if(t.is_not_a_date_time()) return t; 
    local_date_time lt(t.date(), t.time_of_day(), localtz, local_date_time::NOT_DATE_TIME_ON_ERROR); 
    return lt.utc_time(); 
} 
Cuestiones relacionadas