De acuerdo con official (gregorian) calendar, el número de semana para 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 está bien, las reglas son reglas.¿Está .NET dándome el número de semana equivocado para el 29 de diciembre de 2008?
Así que de acuerdo a este calendario, tenemos estos valores límite para 2008/2009
- 28/12 es la Semana 52
- 29/12 es la semana 1
- 1/1 es la semana 1
- 8/1 es la Semana 2
C# ofrece una clase GregorianCalendar, que tiene una función GetWeekOfYear(date, rule, firstDayOfWeek)
.
El parámetro rule
es una enumeración con 3 valores posibles: FirstDay, FirstFourWeekDay, FirstFullWeek
. Por lo que he entendido, debería ir a la regla FirstFourWeekDay
, pero probé todas ellas por si acaso.
El último parámetro informa qué día de la semana se debe considerar como el primer día de la semana, de acuerdo con ese calendario, es lunes, así que el lunes es.
Así que disparó 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 lo que me pasa
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
--------------------------------------------
Así que como vemos, ninguna de las combinaciones anteriores coincide con el calendario oficial (si tiene prisa, simplemente vea que 29/12 nunca recibe la semana n. ° 1).
¿Qué me estoy equivocando aquí? Tal vez hay algo evidente que me estoy perdiendo? (es viernes y tarde horas de trabajo aquí en Bélgica, tengan paciencia;))
Editar: Tal vez debería explicar: lo que necesito es una función que funciona para cualquier año, devolviendo los mismos resultados que el calendario gregoriano que vincula . Así que no hay soluciones especiales para 2008.
hmm ... MS desobedeciendo los estándares? Estoy sorprendido. – rmeador
Pareciendo prometedor :) lamentablemente no puedo probar esto ahora, pero lo haré mañana. – rodbv
rmeador: por lo que he visto Java tiene el mismo problema ... – rodbv