2012-01-05 12 views
9

Los problemas es:impulso: obtener la local_date_time actual con la zona horaria actual de la máquina

  • sé cómo obtener el horario local de impulso

el código:

boost::local_time::local_date_time currentTime(
     boost::posix_time::second_clock::local_time(), 
     boost::local_time::time_zone_ptr()); 
    std::cout << currentTime.local_time() << std::endl; 
  • Sé cómo obtener los datos de la zona horaria actual de la máquina (espero que sea una forma correcta)

el código:

tzset(); 
// the var tzname will have time zone names 
// the var timezone will have the current offset 
// the var daylight should show me if there is daylight "on" 

pero todavía no puedo conseguir local_date_time con el time_zone actual ... ¿Alguien sabe, cómo hacerlo?

+0

* ¿Se han * Para imprimir la hora en hora local? Si puede usar UTC, se ahorrará todo tipo de dolores de cabeza. –

+0

Eche un vistazo al [Date Time IO Tutorial] (http://www.boost.org/doc/libs/1_48_0/doc/html/date_time/date_time_io.html#date_time.io_tutorial)? –

+0

"¿Tiene que imprimir la hora en tiempo local?" Sí, tengo que :( – Alek86

Respuesta

2

bien, por ahora todavía no sé la respuesta del conjunto

pero no hay código, lo que podría ayudar a imprimir la Hora local actual

(basado en una respuesta para una pregunta relacionada aquí (stackoverflow) y algo de código impulso interno)

no estoy absolutamente seguro de que es funcionará correctamente en todos los equipos, pero por ahora es mejor que nada:

boost::posix_time::time_duration getUtcOffset(const boost::posix_time::ptime& utcTime) 
{ 
    using boost::posix_time::ptime; 
    const ptime localTime = boost::date_time::c_local_adjustor<ptime>::utc_to_local(utcTime); 
    return localTime - utcTime; 
} 

std::wstring getUtcOffsetString(const boost::posix_time::ptime& utcTime) 
{ 
    const boost::posix_time::time_duration td = getUtcOffset(utcTime); 
    const wchar_t fillChar = L'0'; 
    const wchar_t timeSeparator = L':'; 

    std::wostringstream out; 
    out << (td.is_negative() ? L'-' : L'+'); 
    out << std::setw(2) << std::setfill(fillChar) 
     << boost::date_time::absolute_value(td.hours()); 
    out << L':'; 
    out << std::setw(2) << std::setfill(fillChar) 
     << boost::date_time::absolute_value(td.minutes()); 
    return out.str(); 
} 
int main() 
{ 
    const boost::posix_time::ptime utcNow = 
     boost::posix_time::second_clock::universal_time(); 

    const std::wstring curTimeOffset = getUtcOffsetString(utcNow); 
    std::wcout << curTimeOffset.c_str() << std::endl; // prints -05:00 on my comp 
} 
+0

Ignorar DST significa que la aritmética del calendario (por ejemplo, restar una fecha_dura) no funcionará correctamente en el objeto local_date_time devuelto. –

1

Dado que dices que tienes información de zona horaria, la única pregunta es cómo usar la mejora para formatear la cadena que necesitas. A continuación se muestra un ejemplo de código:

using namespace boost::local_time; 
    using namespace boost::posix_time; 

    // Composing this string is the most tricky part. Syntax see in: 
    // boost\date_time\local_time\posix_time_zone.hpp 
    string posix_tz_def("PST-5PDT01:00:00,M4.1.0/02:00:00,M10.1.0/02:00:00"); 
    local_date_time ldt(second_clock::local_time(), 
         time_zone_ptr(new posix_time_zone(posix_tz_def))); 

    std::stringstream ss; 
    local_time_facet* output_facet = new local_time_facet(); 
    ss.imbue(std::locale(std::locale::classic(), output_facet)); 
    output_facet->format("%Y-%m-%dT%H:%M:%S %Q"); 
    ss << ldt; 

    string formatted_datetime = ss.str(); // 2012-01-05T18:14:06 -05:00 

En este enfoque parte más problemática es la cadena zona horaria POSIX. Creo que debe haber bases de datos con estas cadenas para cada zona horaria y boost proporciona una plantilla para trabajar con el archivo .csv. Si lo único que necesita es desplazamiento en la cadena, simplemente configure DTS a 0:00:00 y no se preocupe por el resto. Por ejemplo, use esta cadena: PST-5:30PDT0,0,365 (para siempre PDT, shift 0). Sustituye "-5: 00" con el desplazamiento que necesites.

Sin embargo, C++/boost sería implementar su propio proveedor de zona horaria derivando de date_time::time_zone_base.

Más muestras e ideas se pueden encontrar here.

+0

No responde la pregunta. No es una sobre el formateo de una cadena, pero sobre la construcción de un objeto local_date_time. –

0

lo tanto, si también es necesario para obtener desplazamiento correcto que mi ejemplo anterior UTC debe ser modificado un poco para producir cadena de zona horaria correcta:

static boost::posix_time::time_duration utc_offset(
    second_clock::local_time() - second_clock::universal_time()); 
std::ostringstream ss_posix_tz_def; 
// We don't care about real zone name so, just put any three letters. 
ss_posix_tz_def << "LOC" << utc_offset; 
string posix_tz_def = ss_posix_tz_def.str(); 

Otra solución es escribir todo un nuevo proveedor de zona horaria. Al igual que este sencillo:

// We assume local TZ doesn't have DST, UTC offset is calculated basing on 
// local system clocks. Thus, using of this provider for time calculations for 
// an arbitrary date is not a good idea. 
class machine_time_zone : public boost::local_time::custom_time_zone { 
public: 
    typedef boost::local_time::custom_time_zone base_type; 
    typedef base_type::time_duration_type time_duration_type; 

    machine_time_zone() 
    : boost::local_time::custom_time_zone(
     time_zone_names("Local machine TZ", "LOC", "", ""), 
     GetUTCOffset(), 
     boost::local_time::dst_adjustment_offsets(
      time_duration_type(0, 0, 0), 
      time_duration_type(0, 0, 0), time_duration_type(0, 0, 0)), 
     boost::shared_ptr<boost::local_time::dst_calc_rule>()) { 
    } 

    // This method is not precise, real offset may be several seconds more or less. 
    static const boost::posix_time::time_duration& GetUTCOffset() { 
    using boost::posix_time::second_clock; 
    static boost::posix_time::time_duration utc_offset(
     second_clock::local_time() - second_clock::universal_time()); 
    return utc_offset; 
    } 
}; 

sólo tiene que pasar que cuando se construye local_date_time:

local_date_time ldt(second_clock::local_time(), 
        time_zone_ptr(new machine_time_zone())); 
+0

Ignorar DST significa que la aritmética de calendario (por ejemplo, restar una fecha_dura) no funcionará correctamente en el objeto local_date_time devuelto. –

Cuestiones relacionadas