El cambio horario y .net

reloj  Este próximo domingo, 26 de Octubre, se ajustará la hora en España al horario de invierno. A las 3:00 serán las 2:00. La buena noticia es que podremos dormir una hora más, la mala, que esto puede afectar a nuestras aplicaciones.

Fijaros por ejemplo el caso de una aplicación que calcule la producción de piezas de una máquina por hora, por poner un ejemplo. Si queremos saber la producción media por hora entre las 1:00 y las 4:00 de la mañana, deberemos tener en cuenta que en realidad habrán transcurrido cuatro horas y no tres, debido al cambio horario. Según como estemos manejando las fechas en nuestra aplicación puede que nuestros cálculos sean correcto o no.

Para que los cálculos sean correctos debemos utilizar horas universales para calcular el intervalo de tiempo transcurrido.

Como nada deja las cosas más claras que un ejemplo, compilad y observad los resultados de código que pongo a continuación, quizás os sorprendan:

using System;

 

namespace DayligthSavingsTimeEffects

{

   class Program

   {

     static void Main(string[] args)

     {

       DateTime dt1 = new DateTime(2008, 10, 26, 1, 0, 0);

       DateTime dt2 = new DateTime(2008, 10, 26, 4, 0, 0);

 

       double hoursElapsed = (dt2 – dt1).TotalHours;

       Console.WriteLine(

         “Horas entre la 1 y las 4 (sin tener en cuenta el cambio horario): {0}”,

         hoursElapsed);

 

       hoursElapsed = (dt2.ToUniversalTime() – dt1.ToUniversalTime()).TotalHours;

       Console.WriteLine(

         “Horas entre las 1 y las 4 (teniendo en cuenta el cambio horario): {0}”,

         hoursElapsed);

     }

   }

}

La moraleja es: siempre que hagáis operaciones entre horas en las que se deban considerar los posibles cambios horarios, convertid antes a hora universal. O lo que es mejor aun, siempre haced las operaciones entre horas, con horas universales. Fijaros que este problema no solo afecta a operaciones en las que queremos ver el tiempo transcurrido sino también a operaciones en las que sumemos horas, por ejemplo.

Trabajar con fechas parece simple pero debemos tener un buen puñado de cuestiones en mente si queremos evitar problemas cuando nuestra aplicación corra en sistemas con diferentes calendarios o diferentes políticas de cambio horario para ahorro de energia. En la MSDN hay un interesante artículo que recopila todas la buenas prácticas que debemos considerar al trabajar con fechas, merece la pena leerlo.

7 comentarios en “El cambio horario y .net”

  1. Qué grande eres…no conocía el método “ToUniversalTime()”; las fechas, las horas y los diferentes formatos, una de las eternas batallas de los programadores…

    Espero que no hayas hackeado el ejemplillo para despertarme en la madrugada del domingo ;-).

    SaludoX.

  2. Una pregunta, imagina que tengo que calcular la diferencia en horas de la resta de dos fechas una actual y la otra antes de que se produjera el cambio de horario de invierno, por ejemplo cuando nacio Jesucristo, has probado esto, yo creo que no funcionara, sera un bug ???? 🙂

  3. Juan tio, joder que cosas se te ocurren, entre tu y Enrique… 😉 pues no se la verdad… ni se me ha pasado por la cabeza… supongo que habrán contemplado esa posibilidad…

    En España el cambio horario se aplica desde 1974, he buscado el dato (supongo que lo tendrán en cuenta según la cultura)…

    ¡Un saludo!

Deja un comentario

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