2012-01-10 19 views
12

Estoy en el medio del cálculo de los números de semana para las fechas, pero el System.Globalization.Calendar está devolviendo resultados impares para (entre otros años) el 31 de diciembre del año 2007 y 2012.System.Globalization.Calendar.GetWeekOfYear() devuelve resultados impares

Calendar calendar = CultureInfo.InvariantCulture.Calendar; 
var date = new DateTime(2007, 12, 29); 
for (int i = 0; i < 5; i++) 
{ 
    int w = calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
    Console.WriteLine("{0}\t{1}", date.ToString("dd.MM.yyyy"), w); 
    date = date.AddDays(1); 
} 

Resultados

29.12.2007  52 
30.12.2007  52 
31.12.2007  53 <-- 
01.01.2008  1 
02.01.2008  1 

29.12.2012  52 
30.12.2012  52 
31.12.2012  53 <-- 
01.01.2013  1 
02.01.2013  1 

por lo que yo entiendo, no debería ser una semana 53 en el año 2007 y 2012, pero los días deberían incluirse en la semana 1. ¿hay una manera para cambiar este comportamiento en el Calendar?

+2

"Se supone que los días deben estar incluidos en la semana 1": según qué regla? De acuerdo con las reglas que conozco, los últimos días del año nunca forman parte de la primera semana del próximo año ... –

+3

Según ISO 8601. http://en.wikipedia.org/wiki/ISO_8601 – sshow

+0

Por cierto, ¿por qué? ¿Estás usando ese extraño formato de fecha? Creo que nunca he visto fechas escritas como '2007.12.29'. – svick

Respuesta

12

El documentation for the CalendarWeekRule enumeration establece específicamente que "no se correlaciona directamente con la norma ISO 8601" y enlaces a ISO 8601 Week of Year format in Microsoft .Net, una entrada de blog que describe las diferencias.

+0

Esto explica todo. Gracias – sshow

+7

Ni siquiera quiero mirar la solución. Mi simple pregunta es: ¿Por qué? ¿Quién se beneficia de esto? ¿Por qué * ligeramente * cambia para que tenga que elegir dos fechas de cada diez para ver la diferencia? Un poco frustrante ... – Piddu

0

No tiene que haber 52 semanas para que los identificadores de la semana sean únicos, simplemente no tiene necesariamente 7 días en una semana en particular.

Si esto es un problema para usted, agregue el código para manejar la caja de borde.

1

Eche un vistazo a los valores de CalendarWeekRule. Estás usando FirstFourDayWeek, y estás obteniendo los valores que describes. Si desea que cada semana tenga exactamente 7 días, debe usar FirstFullWeek.

En su caso, eso significaría que 31. 12. 2007 será la semana 53, pero también lo hará 2. 1. 2008.

+1

Esa solución no cumple con ISO 8601, ya que * la primera semana con la mayoría (cuatro o más) de sus días en el inicio año [es la semana 1] * – sshow

Cuestiones relacionadas