españa - Conversión entre hora local y GMT/UTC en C/C++
hora utc colombia (3)
¿Cuál es la mejor manera de convertir tiempos de datos entre hora local y UTC en C / C ++?
Por "fecha y hora", me refiero a una representación de tiempo que contiene fecha y hora del día. Estaré feliz con time_t
, struct tm
, o cualquier otra representación que lo haga posible.
Mi plataforma es Linux.
Aquí está el problema específico que estoy tratando de resolver: obtengo un par de valores que contienen una fecha juliana y una cantidad de segundos en el día. Esos valores están en GMT. Necesito convertir eso en un valor de zona horaria local "YYYYMMDDHHMMSS". Sé cómo convertir la fecha juliana a YMD, y obviamente es fácil convertir los segundos en HHMMSS. Sin embargo, la parte difícil es la conversión de zona horaria. Estoy seguro de que puedo encontrar una solución, pero preferiría encontrar una forma "estándar" o "conocida" en lugar de tropezar.
Una pregunta posiblemente relacionada es Obtener fechas de transición para el horario de verano en C
Se supone que debes usar combinaciones de gmtime
/ timegm
y timegm
/ mktime
. Eso debería darle las herramientas ortogonales para hacer conversiones entre struct tm
y time_t
.
Para UTC / GMT:
time_t t;
struct tm tm;
struct tm * tmp;
...
t = timegm(&tm);
...
tmp = gmtime(t);
Para hora local:
t = mktime(&tm);
...
tmp = localtime(t);
Todo lo que hace tzset()
es establecer la variable de zona horaria interna desde la variable de entorno TZ
. No creo que esto deba ser llamado más de una vez.
Si está intentando convertir entre zonas horarias, debe modificar la struct tm
tm_gmtoff
.
Si está en Windows, no tiene timegm () disponible para usted:
struct tm *tptr;
time_t secs, local_secs, gmt_secs;
time( &secs ); // Current time in GMT
// Remember that localtime/gmtime overwrite same location
tptr = localtime( &secs );
local_secs = mktime( tptr );
tptr = gmtime( &secs );
gmt_secs = mktime( tptr );
long diff_secs = long(local_secs - gmt_secs);
o algo similar...
Si necesita preocuparse por convertir la fecha / hora con las reglas de la zona horaria, es posible que desee consultar la ICU .