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.

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>

Tags:  , , , ,

Answer

  1. Avatar for 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() y localtime_r() para convertir el tiempo de época a struct tm con el ajuste de DST aplicado. Luego puedes calcular el desplazamiento como antes.

    #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 de época actual
      time ( &rawtime );
    
      // convertir el tiempo de época rawtime a struct tm en GMT
      gmtime_r(&rawtime, &gtm);
    
      // convertir de nuevo el struct tm GMT a tiempo de época g_epoch
      g_epoch = mktime(&gtm);
    
      //convertir el tiempo de época rawtime a "struct tm* ltm" en la zona horaria local
      localtime_r(&rawtime, &ltm);
    
      // convertir de nuevo la zona horaria local "struct tm* ltm" a tiempo de época 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("Local Epoch: %u\n", l_epoch);
      printf("Offset: %ld\n", offset);
    
      return 0;
    }
    

    Este código utiliza las funciones gmtime_r() y localtime_r() para obtener struct 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>

Comments are closed.