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