¿De verdad no tiene esto el Framework?…

Escribo este post por dos motivos: uno que quiza a alguien le sirva esta funcioncita y dos, que quizás alguien me ayude con mi dilema. Ya se que esto es mucho más mundano que los retos de Programacia101… pero bueno.

Necesito calcular las horas transcuridas en el año para un fecha y hora dadas. La única manera de solucionar el problema que he encontrado es con la función que muestro abajo, pero no puedo creer que no haya una manera más elegante de solucionar este problema. Incluso sospecho que debe de haber algún método del Framework que haga esto directamente pero no doy con él.

    /// <summary>

    /// Dada una fecha, nos devuelve el número de horas que han trascurrido

    /// desde comienzo de año

    /// </summary>

    /// <param name=»date»>

    /// Fecha para la que queremos las horas desde el inicio de año

    /// </param>

    private static short GetHoursOnYear(DateTime date)

    {

      DateTime beginOfYear = new DateTime(date.Year, 1, 1, 0, 0, 0);

      TimeSpan diff = date – beginOfYear;

      double diffHours = diff.TotalHours;

      Debug.Assert(diffHours <= 24 * 365);

      return (short)diffHours;

    }

NOTA: Después de darle algunas vueltas entre todos (ver los comentarios), la función, definitivamente a quedad así:

    private static short GetHoursOnYear(DateTime dateTime)

    {

      return (short)((dateTime.DayOfYear – 1) * 24 + dateTime.Hour);

    }

14 comentarios sobre “¿De verdad no tiene esto el Framework?…”

  1. Penyaskito… elegante solución… gracias por abrirme los ojos… intuía la existencia de una solución mejor pero estaba obcecado…

    Estoy es lo que me encanta de programar, hasta la más simple función puede ser mejorada.

    La función queda:

    private static short GetHoursOnYear(DateTime date)
    {
    return (short)date.DayOfYear * 24 + date.Hour;
    }

    A veces es dificil ver la solución buena…

  2. Yo necesito que devuelva un short porque eso se escribe en un registro de un PLC de 16 bits utilizando OPC.

    Pero vamos tampoco veo porque devolver un int sería mejor que devolver un short. El coste ese cast es prácticamente despreciable y ahoras ¡16 bits de memoria!

  3. Cuidado con los cambios horarios Invierno Verano.

    Creo que las funciones propuestas no tienen en cuenta ese tema. Si la fecha esta entre el último Domingo de Marzo (23 horas) y el último de Octubre (25 horas), tendras que restar una hora.

    Saludos.

  4. Lo correcto sería utilizar el calendario correspondiente para determinar el día del año

    Calendar calendar = new GregorianCalendar();
    int dia = calendar.GetDayOfYear(DateTime.Now);

    Saludos.

  5. Y no es mejor usar el datediff de visual basic en c#. Para ello añadimos la referencia a Microsoft.VisualBasic y hacemos:

    using Microsoft.VisualBasic;

    y ya podemos usar la clase estatica DateAndTime de la forma siguiente:

    DateInterval.Minute,fecha1, fecha2);

    Un saludo

  6. Cito: «Perdon me falto codigo antes:

    DateAndTime.DateDiff(DateInterval.Minute, fecha1, fecha2);»
    Gines, disculpa pero he tratado de realizar esa operacion y me arroja error, pues indica que no existe en el contexto actual aun importando Microsoft.etc.

    he tratado de varias formas pero aun no enuentro como usar el datediff en C# solo necesito la diferencia de dias entre dos fechas.

Responder a anonymous Cancelar respuesta

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