Saltar al contenido

Cálculo del horario de verano a partir de una sola fecha

Bienvenido a nuestra página web, en este sitio vas a hallar la solucíon que buscas.

Solución:

Esto es en realidad engañosamente simple. Hay algunos datos que nos ayudarán:

  1. En la mayor parte de los EE. UU., el horario de verano comienza el segundo domingo de marzo y finaliza el primer domingo de noviembre, a las 2:00 a. m. en ambas ocasiones.
  2. El segundo domingo de marzo será siempre entre el 8 y el 14 inclusive.
  3. El primer domingo de noviembre será siempre entre el 1 y el 7 inclusive.
  4. La numeración del día de la semana es bastante conveniente porque el día – día de la semana le dará el domingo anterior.

Estos hechos conducen al siguiente código (C#, pero trivialmente portátil para su plataforma):

    public bool IsDST(int day, int month, int dow)
    
        //January, february, and december are out.
        if (month < 3 

Resulta que ni siquiera necesita saber el año para hacer esto, siempre que pueda confiar en el valor del día de la semana.

Escribí una prueba de unidad rápida y verifiqué que este código está de acuerdo con TimeZone.IsDayLightSavingsTime() para todas las fechas de 1800 a 2200. No tomé en cuenta la regla de las 2 a. Noviembre).

Código para Europa Central (probado todos los días en el rango 2014-3000 año)

    public static bool IsDst(int day, int month, int dow)
    
        if (month < 3 

Función de prueba

    static void Main(string[] args)
    
        TimeZoneInfo tzf2 = TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard Time");

        var date = new DateTime(2014, 01, 1, 5, 0,0);
        bool wasSummer = false;

        while (date <= new DateTime(3000,1,1))
                                                 
            var dow = (int) date.DayOfWeek;

            var isDst = IsDst(date.Day, date.Month, dow);               

            DateTime f2 = TimeZoneInfo.ConvertTime(date, tzf2);
            var isSummer = f2.IsDaylightSavingTime();

            if (isSummer != isDst)
            
                Console.WriteLine("ERROR");
                Console.WriteLine(date);
            

            if (isSummer != wasSummer)
            
                Console.WriteLine(date.AddDays(-1).ToShortDateString());
            

            date = date.AddDays(1);
            wasSummer = isSummer;
        

        Console.ReadKey();

Si bien es fácil calcular si una fecha en particular está en horario de verano para una ubicación en particular según las reglas actuales, tenga en cuenta que el horario de verano depende del capricho de los políticos y podría cambiar en cualquier momento. Tengo un reloj fabricado antes de 2007 que se ajusta automáticamente al horario de verano y ahora tengo que cambiarlo cuatro veces al año: dos veces cuando se produce el cambio real, y dos veces cuando ahora cambia incorrectamente en las fechas anteriores.

En este caso, es posible que pueda ignorar el horario de verano por completo con el simple recurso de que el usuario ingrese la zona horaria junto con la fecha y la hora. O puede hacer lo mismo que la mayoría de los dispositivos de consumo y dejar que el usuario ajuste la hora a la zona horaria local dos veces al año.

Pero si realmente necesita manejar el horario de verano y realmente quiere hacer las cosas bien, use la base de datos zoneinfo y asegúrese de que pueda actualizarse de alguna manera. Si no puede hacer eso por alguna razón, al menos permita que el usuario anule las reglas. Y si incluso eso es demasiado difícil, al menos déle al usuario la opción de desactivar los ajustes automáticos (a diferencia de mi estúpido despertador).

Sección de Reseñas y Valoraciones

Si haces scroll puedes encontrar las notas de otros creadores, tú todavía eres capaz mostrar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *