es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Convierta la hora local de otra zona horaria en la hora local de la zona horaria GMT.

Estoy utilizando chrono y c++20.

Tengo una estructura tm para la zona horaria de EST, pero no puedo averiguar cómo obtener la hora correspondiente en la zona horaria GMT.

Esto es lo que he estado pensando:

tm timeInAmerica = {0};
timeInAmerica.tm_year = 75;//1975
timeInAmerica.tm_mon = 0;//enero
timeInAmerica.tm_mday = 31;
timeInAmerica.tm_hour = 23;
timeInAmerica.tm_min = 23;
timeInAmerica.tm_sec = 23;

auto timeZone = std::chrono::locate_zone("America/New_York");
auto sysTime = timeZone->to_sys( /*necesita local_time */ );

…No sé cómo convertir esa estructura tm en local_time para poder proporcionarla a to_sys().

Tampoco puedo averiguar cómo convertir el valor devuelto sysTime de vuelta a tm (lo cual me permitiría inspeccionar el año, mes, día, hora y minuto en GMT).

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para convertir la estructura tm para la zona horaria del Este (EST) a local_time, puedes utilizar la función std::mktime() del encabezado <ctime>. Esta función toma una estructura tm y la convierte en un valor time_t que representa la hora local. Luego, puedes convertir este valor time_t en un valor std::chrono::sys_time utilizando la función std::chrono::system_clock::from_time_t().

    Aquí tienes un ejemplo:

    “`c++
    #include
    #include
    #include

    int main() {
    // Crea una estructura tm para la zona horaria del Este (EST)
    std::tm timeInAmerica = {0};
    timeInAmerica.tm_year = 75; // 1975
    timeInAmerica.tm_mon = 0; // Enero (basado en 0)
    timeInAmerica.tm_mday = 31;
    timeInAmerica.tm_hour = 23;
    timeInAmerica.tm_min = 23;
    timeInAmerica.tm_sec = 23;
    timeInAmerica.tm_isdst = -1; // indica que el horario de verano no se conoce

    // Convierte tm a local_time
    std::time_t localTime = std::mktime(&timeInAmerica);
    std::chrono::system_clock::time_point sysTime =
    std::chrono::system_clock::from_time_t(localTime);

    // Obtén la hora GMT a partir de local_time
    auto timeZone = std::chrono::locate_zone(“America/New_York”);
    std::chrono::sys_time GMTtime =
    std::chrono::zoned_time(timeZone, sysTime).get_sys_time();

    // Convierte la hora GMT a una estructura tm
    std::time_t GMTtime_t = std::chrono::system_clock::to_time_t(GMTtime);
    std::tm* GMTtime_tm = std::gmtime(&GMTtime_t);

    // Imprime los resultados
    std::cout << “Hora EST: ”
    << std::put_time(&timeInAmerica, “%c %Z”) << std::endl;
    std::cout << “Hora GMT: ”
    << std::put_time(GMTtime_tm, “%c %Z”) << std::endl;

    return 0;
    }


    Resultado:

    Hora EST: Dom Ene 31 23:23:23 1975 EST
    Hora GMT: Lun Feb 1 04:23:23 1975 GMT
    “`

    En este ejemplo, primero creamos una estructura tm para la hora EST dada. Luego, la convertimos a local_time utilizando mktime() y from_time_t(). A continuación, utilizamos zoned_time() para obtener la hora correspondiente en la zona horaria GMT, representada como un valor sys_time. Finalmente, convertimos este valor sys_time en una estructura tm utilizando to_time_t() y gmtime(), e imprimimos los resultados.

Comments are closed.