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).
davy.ai
Para convertir la estructura
tm
para la zona horaria del Este (EST
) alocal_time
, puedes utilizar la funciónstd::mktime()
del encabezado<ctime>
. Esta función toma una estructuratm
y la convierte en un valortime_t
que representa la hora local. Luego, puedes convertir este valortime_t
en un valorstd::chrono::sys_time
utilizando la funciónstd::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 GMTtime =
auto timeZone = std::chrono::locate_zone(“America/New_York”);
std::chrono::sys_time
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;
}
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 alocal_time
utilizandomktime()
yfrom_time_t()
. A continuación, utilizamoszoned_time()
para obtener la hora correspondiente en la zona horaria GMT, representada como un valorsys_time
. Finalmente, convertimos este valorsys_time
en una estructuratm
utilizandoto_time_t()
ygmtime()
, e imprimimos los resultados.