¿Me está dando .NET el número de semana equivocado para el 29 de diciembre de 2008?
De acuerdo con lacalendario oficial (gregoriano), el número de semana para el 29/12/2008 es 1, porque después del último día de la semana 52 (es decir, 28/12) quedan tres o menos días en el año. Un poco raro, pero bueno, las reglas son reglas.
De acuerdo con este calendario, tenemos estos valores límite para 2008/2009
28/12 es la semana 5229/12 es la semana 11/1 es la semana 18/1 es la semana 2C # ofrece una clase GregorianCalendar, que tiene una funciónGetWeekOfYear(date, rule, firstDayOfWeek)
.
El parámetrorule
es una enumeración con 3 valores posibles:FirstDay, FirstFourWeekDay, FirstFullWeek
. Por lo que he entendido, debo ir por elFirstFourWeekDay
regla, pero los probé todos por si acaso.
El último parámetro informa qué día de la semana debe considerarse el primer día de la semana, de acuerdo con ese calendario, es lunes, así que es lunes.
Así que encendí una aplicación de consola rápida y sucia para probar esto:
using System;
using System.Globalization;
namespace CalendarTest
{
class Program
{
static void Main(string[] args)
{
var cal = new GregorianCalendar();
var firstWeekDay = DayOfWeek.Monday;
var twentyEighth = new DateTime(2008, 12, 28);
var twentyNinth = new DateTime(2008, 12, 29);
var firstJan = new DateTime(2009, 1, 1);
var eightJan = new DateTime(2009, 1, 8);
PrintWeekDays(cal, twentyEighth, firstWeekDay);
PrintWeekDays(cal, twentyNinth, firstWeekDay);
PrintWeekDays(cal, firstJan, firstWeekDay);
PrintWeekDays(cal, eightJan, firstWeekDay);
Console.ReadKey();
}
private static void PrintWeekDays(Calendar cal, DateTime dt, DayOfWeek firstWeekDay)
{
Console.WriteLine("Testing for " + dt.ToShortDateString());
Console.WriteLine("--------------------------------------------");
Console.Write(CalendarWeekRule.FirstDay.ToString() + "\t\t");
Console.WriteLine(cal.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, firstWeekDay));
Console.Write(CalendarWeekRule.FirstFourDayWeek.ToString() + "\t");
Console.WriteLine(cal.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, firstWeekDay));
Console.Write(CalendarWeekRule.FirstFullWeek.ToString() + "\t\t");
Console.WriteLine(cal.GetWeekOfYear(dt, CalendarWeekRule.FirstFullWeek, firstWeekDay));
Console.WriteLine("--------------------------------------------");
}
}
}
... y esto es lo que obtengo
Testing for 28.12.2008
--------------------------------------------
FirstDay 52
FirstFourDayWeek 52
FirstFullWeek 51
--------------------------------------------
Testing for 29.12.2008
--------------------------------------------
FirstDay 53
FirstFourDayWeek 53
FirstFullWeek 52
--------------------------------------------
Testing for 01.01.2009
--------------------------------------------
FirstDay 1
FirstFourDayWeek 1
FirstFullWeek 52
--------------------------------------------
Testing for 08.01.2009
--------------------------------------------
FirstDay 2
FirstFourDayWeek 2
FirstFullWeek 1
--------------------------------------------
Entonces, como vemos, ninguna de las combinaciones anteriores coincide con el calendario oficial (si tiene prisa, solo vea que 29/12 nunca obtiene la semana # 1).
¿Qué me estoy equivocando aquí? Tal vez hay algo evidente que me estoy perdiendo? (Es viernes y horas de trabajo tarde aquí en Bélgica, tengan paciencia conmigo;))
Editar: Tal vez debería explicar: lo que necesito es una función que funcione para cualquier año, devolviendo los mismos resultados que el calendario gregoriano que vinculé. Así que no hay soluciones especiales para 2008.