¿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);

    }

Published 22/11/2007 18:13 por Rodrigo Corral
Archivado en: ,
Comparte este post:
http://geeks.ms/blogs/rcorral/archive/2007/11/22/191-de-verdad-no-tiene-esto-el-framework.aspx

Comentarios

# re: ¿De verdad no tiene esto el Framework?...

En VB.NET Está DateDiff:

DateDiff("h", StartDateTime, EndDateTime)

Pero en C# no se su equivalente

Salu2

Thursday, November 22, 2007 6:30 PM por Luis Ruiz Pavón

# re: ¿De verdad no tiene esto el Framework?...

Pues como dice Luis, la cosa sería un DateDiff para C#...algún ejemplillo más:

www.dotnetspider.com/.../Article1552.aspx

...y este:

www.aspcode.net/C-Datediff.aspx...interesante la idea de referenciar la función DateDiff de VB.NET en un programa C#.

Saludos

JC's

Thursday, November 22, 2007 7:44 PM por Juan Carlos González Martín

# re: ¿De verdad no tiene esto el Framework?...

           DateTime d = new DateTime();

           return d.DayOfYear * 24 + d.Hour;

Thursday, November 22, 2007 8:10 PM por penyaskito

# re: ¿De verdad no tiene esto el Framework?...

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...

Thursday, November 22, 2007 9:15 PM por Rodrigo Corral

# re: ¿De verdad no tiene esto el Framework?...

De nada, Rodrigo. Siempre 2N (N>1) ojos ven más que 2. ;-)

Thursday, November 22, 2007 10:35 PM por penyaskito

# Revisiones de c??digo &laquo; Penyaskito

PingBack desde  Revisiones de c??digo &laquo; Penyaskito

Thursday, November 22, 2007 10:57 PM por Revisiones de c??digo « Penyaskito

# re: ¿De verdad no tiene esto el Framework?...

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!

Friday, November 23, 2007 2:49 PM por Rodrigo Corral

# re: ¿De verdad no tiene esto el Framework?...

El día del año empieza por uno, así que debería ser:

(date.DayOfYear-1) * 24 + date.Hour

Friday, November 23, 2007 6:21 PM por Luis Martinez Aniesa

# re: ¿De verdad no tiene esto el Framework?...

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.

Monday, November 26, 2007 9:21 AM por Eduardo

# re: ¿De verdad no tiene esto el Framework?...

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.

Wednesday, November 28, 2007 6:32 PM por Leonardo Micheloni

# re: ¿De verdad no tiene esto el Framework?...

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

Tuesday, September 16, 2008 8:52 PM por Gines

# re: ¿De verdad no tiene esto el Framework?...

Perdon me falto codigo antes:

DateAndTime.DateDiff(DateInterval.Minute, fecha1, fecha2);

Tuesday, September 16, 2008 8:55 PM por Gines

# re: ¿De verdad no tiene esto el Framework?...

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.

Friday, January 23, 2009 3:02 PM por oscar

# re: ¿De verdad no tiene esto el Framework?...

.NET APEEEEEEEEEEESTA!!!!!!!!

MICROSOFT APARA ATRAS............

Friday, September 04, 2009 2:06 AM por juan