2010-10-04 19 views

Respuesta

14

Hay dos partes a esta pregunta:

  1. Obtener el desplazamiento UTC como un formato boost::posix_time::time_duration
  2. la time_duration como se especifica

Al parecer, recibiendo la zona horaria local es no expuesto muy bien en una API ampliamente implementada. Podemos, sin embargo, conseguirlo tomando la diferencia de un momento con respecto a la hora UTC y el mismo momento en relación con la zona horaria actual, así:

boost::posix_time::time_duration get_utc_offset() { 
    using namespace boost::posix_time; 

    // boost::date_time::c_local_adjustor uses the C-API to adjust a 
    // moment given in utc to the same moment in the local time zone. 
    typedef boost::date_time::c_local_adjustor<ptime> local_adj; 

    const ptime utc_now = second_clock::universal_time(); 
    const ptime now = local_adj::utc_to_local(utc_now); 

    return now - utc_now; 
} 

Formateo de la compensación según lo especificado es sólo una cuestión de imbuir a la derecha time_facet:

std::string get_utc_offset_string() { 
    std::stringstream out; 

    using namespace boost::posix_time; 
    time_facet* tf = new time_facet(); 
    tf->time_duration_format("%+%H:%M"); 
    out.imbue(std::locale(out.getloc(), tf)); 

    out << get_utc_offset(); 

    return out.str(); 
} 

Ahora, get_utc_offset_string() rendirá el resultado deseado.

+0

es un tema complicado; un desplazamiento UTC específico puede corresponder a múltiples zonas horarias, por ejemplo. –

+0

@Roger: Entonces ... ¿Supongo que la forma correcta de decirlo es que estoy buscando el desplazamiento UTC para la hora actual, no la zona horaria? –

+1

Sí, si eso es lo que le interesa (que también es lo que me parece), esta respuesta es perfecta. Estaba respondiendo más a "conseguir que la zona horaria local no esté expuesta muy bien en una API ampliamente implementada". Solo tenga en cuenta que el desplazamiento UTC que obtiene para hoy podría ser diferente más tarde (o antes). –

1

Como C++ 11 se puede utilizar crono y std::put_time:

#include <chrono> 
#include <iomanip> 
#include <iostream> 
int main() 
{ 

    using sc = std::chrono::system_clock; 
    auto tm = sc::to_time_t(sc::now()); 

    std::cout << std::put_time(std::localtime(&tm), "formatted time: %Y-%m-%dT%X%z\n"); 

    std::cout << "just the offset: " << std::put_time(std::localtime(&tm), "%z\n"); 

} 

Esto produce el siguiente resultado:

vez formateado: 2018-02-15T10: 25: 27 + 0100

sólo el desplazamiento: 0100

Cuestiones relacionadas