[HowTo] Obtener fechas de principio y final de mes… y de trimestre

Vale, lo se. Es una chorrada :-)

Pero es una de esas cosas que no puedes creer que no está implementado en el framework ‘de fábrica’, y si lo está debe estar escondido porque yo no lo he encontrado. Y la cuestión es que ayer necesitaba calcular (a partir de una fecha) las fechas de inicio y final de mes, así como las fechas de inicio y final de trimestre.

Aquí está el código por si alguien se encuentra con el mismo problema:

public static class BaseTypesExtensions
{
    public static int GetQuarter(this DateTime d)
    {
        return ((d.Month - 1) / 3) + 1;
    }
 
    public static DateTime GetMonthFirstDate(this DateTime d)
    {
        return new DateTime(d.Year, d.Month, 1);
    }
 
    public static DateTime GetMonthLastDate(this DateTime d)
    {
        return d.GetMonthFirstDate().AddMonths(1).AddDays(-1);
    }
 
    public static DateTime GetQuarterFirstDate(this DateTime d)
    {
        return new DateTime(d.Year, (d.GetQuarter() * 3) - 2, 1);
    }
 
    public static DateTime GetQuarterLastDate(this DateTime d)
    {
        return d.GetQuarterFirstDate().AddMonths(3).AddDays(-1);
    }
}

Y lo usaríamos de este modo:

var basedate = DateTime.Today.AddYears(-1);
for (int i = 0; i < 23; i++)
{
    basedate = basedate.AddMonths(1);
    var logline = "Date: {0}, Month {1}-{2}, Quarter: {3}-{4}";
    Console.WriteLine(logline, basedate.ToShortDateString(),
        basedate.GetMonthFirstDate().ToShortDateString(), 
        basedate.GetMonthLastDate().ToShortDateString(),
        basedate.GetQuarterFirstDate().ToShortDateString(), 
        basedate.GetQuarterLastDate().ToShortDateString());
}

Produciendo este resultado:

Date: 05/11/2010, Month 01/11/2010-30/11/2010, Quarter: 01/10/2010-31/12/2010
Date: 05/12/2010, Month 01/12/2010-31/12/2010, Quarter: 01/10/2010-31/12/2010
Date: 05/01/2011, Month 01/01/2011-31/01/2011, Quarter: 01/01/2011-31/03/2011
Date: 05/02/2011, Month 01/02/2011-28/02/2011, Quarter: 01/01/2011-31/03/2011
Date: 05/03/2011, Month 01/03/2011-31/03/2011, Quarter: 01/01/2011-31/03/2011
Date: 05/04/2011, Month 01/04/2011-30/04/2011, Quarter: 01/04/2011-30/06/2011
Date: 05/05/2011, Month 01/05/2011-31/05/2011, Quarter: 01/04/2011-30/06/2011
Date: 05/06/2011, Month 01/06/2011-30/06/2011, Quarter: 01/04/2011-30/06/2011
Date: 05/07/2011, Month 01/07/2011-31/07/2011, Quarter: 01/07/2011-30/09/2011
Date: 05/08/2011, Month 01/08/2011-31/08/2011, Quarter: 01/07/2011-30/09/2011
Date: 05/09/2011, Month 01/09/2011-30/09/2011, Quarter: 01/07/2011-30/09/2011
Date: 05/10/2011, Month 01/10/2011-31/10/2011, Quarter: 01/10/2011-31/12/2011
Date: 05/11/2011, Month 01/11/2011-30/11/2011, Quarter: 01/10/2011-31/12/2011
Date: 05/12/2011, Month 01/12/2011-31/12/2011, Quarter: 01/10/2011-31/12/2011
Date: 05/01/2012, Month 01/01/2012-31/01/2012, Quarter: 01/01/2012-31/03/2012
Date: 05/02/2012, Month 01/02/2012-29/02/2012, Quarter: 01/01/2012-31/03/2012

Saludos,

PD – Thx al colega Omar del valle por sugerir una aproximación mucho más sencilla para GetQuarter ;-)

Published 5/10/2011 4:22 por Lluis Franco
Archivado en: ,,,
Comparte este post:

Comentarios

# re: [HowTo] Obtener fechas de principio y final de mes… y de trimestre

Wednesday, October 05, 2011 6:01 AM por jlpardo

Para el último día del mes a mí me gusta más ésta:

System.DateTime.DaysInMonth(int year, int month)

Y no tengo que andar sumando y restando días...

# re: [HowTo] Obtener fechas de principio y final de mes… y de trimestre

Wednesday, October 05, 2011 7:19 AM por Lluis Franco

Si. Así lo tenía en otra versión, pero lo cambié para seguir el mismo patrón que la del trimestre :-)

Ambas son equivalentes, cuestión de gustos...

Gracias por el comentario ;)