Cálculo de desplazamiento para el horario de verano (DST) sin usar localtime.
Tengo el siguiente CÓDIGO para calcular el desplazamiento,
Aquí ejecuté el siguiente código en una máquina con zona horaria EST cuyo desplazamiento es de -18000 segundos, es decir, UTC-5.00
Tenga en cuenta que no puedo usar localtime()
debido a algunas limitaciones que es una historia muy larga mencionar aquí.
Entonces, usé la siguiente lógica para restar el éxodo de GMT del éxodo de hora local como se muestra a continuación, y devolvió perfectamente el desplazamiento.
Ahora, lo que quiero aquí es suponer el caso del DST (horario de verano), donde el desplazamiento será de -14400 segundos, es decir, UTC-4.00. Debido al ajuste +1 del DST (horario de verano) para la zona horaria EST.
¿Funcionará mi código mencionado a continuación? en caso de que el sistema tenga DST (horario de verano).
No puedo realizar pruebas en vivo en este momento, ya que el DST (horario de verano) no está activo en mi máquina.
Está planeado de la siguiente manera:
/etc/localtime Dom Mar 14 06:59:59 2021 UT = Dom Mar 14 01:59:59 2021 EST isdst=0 gmtoff=-18000
/etc/localtime Dom Mar 14 07:00:00 2021 UT = Dom Mar 14 03:00:00 2021 EDT isdst=1 gmtoff=-14400
/etc/localtime Dom Nov 7 05:59:59 2021 UT = Dom Nov 7 01:59:59 2021 EDT isdst=1 gmtoff=-14400
/etc/localtime Dom Nov 7 06:00:00 2021 UT = Dom Nov 7 01:00:00 2021 EST isdst=0 gmtoff=-18000
Entonces quería saber, cuando el DST está activo, es decir, desde el 14 de marzo de 2021 hasta el 7 de noviembre de 2021, ¿mi código a continuación devolverá un desplazamiento de -14400?
¿La función time()
tiene en cuenta el tiempo del éxodo después del ajuste del DST?
#include <stdio.h>
#include <time.h>
int main()
{
time_t rawtime, g_epoch, l_epoch;
struct tm *gtm, *ltm;
signed long int offset;
// Obtener el tiempo actual del éxodo
time(&rawtime);
// Convertir el éxodo rawtime a struct tm en GMT
gtm = gmtime(&rawtime);
// Convertir nuevamente la estructura tm GMT a éxodo
g_epoch = mktime(gtm);
// Convertir el éxodo rawtime a "struct tm * ltm" en la zona horaria local
ltm = localtime(&rawtime);
// Convertir nuevamente la estructura "struct tm * ltm" de la zona horaria local a éxodo l_epoch
l_epoch = mktime(ltm);
// Calcular el desplazamiento
offset = l_epoch - g_epoch;
printf("Rawtime: %u\n", rawtime);
printf("GMTepoch: %u\n", g_epoch);
printf("Éxodo Local: %u\n", l_epoch);
printf("Desplazamiento: %ld", offset);
return 0;
}
Salida:
Rawtime: 1640176204
GMTepoch: 1640194204
Éxodo Local: 1640176204
Desplazamiento: -18000
“`</time.h></stdio.h>
davy.ai
No, el código mencionado no funcionará correctamente en caso de ajuste de DST (Daylight Saving Time). Esto se debe a que la función
time()
devuelve el número de segundos transcurridos desde la época (1970-01-01 00:00:00 UTC), pero no tiene en cuenta el ajuste de DST.En el código dado, el desplazamiento se calcula restando el tiempo de época GMT al tiempo de época local. Pero este cálculo no dará resultados precisos durante los períodos de ajuste de DST porque el desplazamiento UTC cambia durante esos períodos.
Para manejar el ajuste de DST, necesitarás usar una biblioteca de tiempo adecuada que tenga en cuenta el ajuste de DST. Una de esas bibliotecas es la biblioteca
tz
que proporciona funciones para obtener el desplazamiento de zona horaria actual, incluido el ajuste de DST.Alternativamente, también puedes usar las funciones
gmtime_r()
ylocaltime_r()
para convertir el tiempo de época astruct tm
con el ajuste de DST aplicado. Luego puedes calcular el desplazamiento como antes.Este código utiliza las funciones
gmtime_r()
ylocaltime_r()
para obtenerstruct tm
en GMT y hora local, respectivamente, con el ajuste de DST aplicado. Luego calcula el desplazamiento como antes. Este código funcionará correctamente durante los períodos de ajuste de DST.</time.h></stdio.h>