9 11
11
2010

DateDiff en C#

Una de las funciones de Visual Basic que más echamos de menos a la hora de programar en C# es DateDiff.

Para aquellos que no la conozcan, la función DateDiff de Visual Basic (probablemente también os sonará de DateDiff de SQL Server) devuelve un valor numérico que especifica el número de intervalos de tiempo entre 2 fechas; o traducido al castellano, nos devuelve la diferencia entre 2 fechas.

Pues bien, ya que la función DateDiff no existe en sí en C#, vamos a proponer a continuación una alternativa a la misma:

/// <summary>
/// Demo DateTime.DateDiff
/// </summary>
public class DateTimeExtension
{

    /// <summary>
    /// Devuelve un valor Long que especifica el número de
    /// intervalos de tiempo entre dos valores Date.
    /// </summary>
    /// <param name="interval">Obligatorio. Valor de enumeración
    /// DateInterval o expresión String que representa el intervalo
    /// de tiempo que se desea utilizar como unidad de diferencia
    /// entre Date1 y Date2.</param>
    /// <param name="date1">Obligatorio. Date. Primer valor de
    /// fecha u hora que se desea utilizar en el cálculo.</param>
    /// <param name="date2">Obligatorio. Date. Segundo valor de
    /// fecha u hora que se desea utilizar en el cálculo.</param>
    /// <returns></returns>
    public static long DateDiff(DateInterval interval, DateTime date1, DateTime date2)
    {
        long rs = 0;
        TimeSpan diff = date2.Subtract(date1);
        switch (interval)
        {
            case DateInterval.Day:
            case DateInterval.DayOfYear:
                rs = (long)diff.TotalDays;
                break;
            case DateInterval.Hour:
                rs = (long)diff.TotalHours;
                break;
            case DateInterval.Minute:
                rs = (long)diff.TotalMinutes;
                break;
            case DateInterval.Month:
                rs = (date2.Month - date1.Month) + (12*DateTimeExtension.DateDiff(DateInterval.Year, date1, date2));
                break;
            case DateInterval.Quarter:
                rs = (long)Math.Ceiling((double)(DateTimeExtension.DateDiff(DateInterval.Month, date1, date2) / 3.0));
                break;
            case DateInterval.Second:
                rs = (long)diff.TotalSeconds;
                break;
            case DateInterval.Weekday:
            case DateInterval.WeekOfYear:
                rs = (long)(diff.TotalDays/7);
                break;
            case DateInterval.Year:
                rs = date2.Year - date1.Year;
                break;
        }//switch
        return rs;
    }//DateDiff
}

/// <summary>
/// Enumerados que definen los tipos de
/// intervalos de tiempo posibles.
/// </summary>
public enum DateInterval
{
    Day,
    DayOfYear,
    Hour,
    Minute,
    Month,
    Quarter,
    Second,
    Weekday,
    WeekOfYear,
    Year
}

Una vez que tengáis implementada vuestra función DateDiff en C#, podéis realizar alguna pequeña prueba comparativa con la función original DateDiff de Visual Basic para verificar que los resultados son los esperados en vuestras operaciones con fechas.

Tags: ,

9 respuestas en “DateDiff en C#”

  1. justo lo que andaba buscando gracias!!!

  2. (12*DateTimeExtension.DateDiff(DateInterval.Year, date1, date2));

    DateTimeExtension …me sale el cartel “DateTimeExtension no existe en el contexto actual”, alguna idea de como solucionarlo? saludos

    • Te sale ese mensaje porque DateTimeExtension es el nombre de clase del ejemplo. cambialo por el nombre de tu clase con todo el namespace. seguramente le pusiste otro nombre.

  3. Pues así de primeras, se me ocurre que no estés importando el namespace donde se encuentra tu clase DateTimeExtension…

    ¿Están en diferentes espacios de nombres DateTimeExtension de donde la estás invocando?

  4. Muchas gracias, siempre quise trabajar el DateDiff en C#.

  5. Un pedazo de código que se agradece, ademas según mi opinión se realizo de la forma en como debe ser una función Datediff.. bien hecho y Muchas Gracias por el conocimiento.

  6. Muchas gracias amigo

  7. Mil Gracias esta genial… cuando salga de aca de una el me gusta :)

  8. Tengo una duda,
    Si yo ingreso las fechas
    date1= 31/12/2012
    date2= 01/01/2013
    al parecer me respondería
    años = 1
    pero en realidad ¿no solo paso 1 día?

Dejar un comentario