¿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 2

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

Respuestas a la pregunta(7)

Su respuesta a la pregunta