2012-01-10 18 views
12

Sono nel mezzo del calcolo dei numeri delle settimane per le date, ma il System.Globalization.Calendar restituisce risultati strani per (tra gli altri) 31 dicembre 2007 e 2012.System.Globalization.Calendar.GetWeekOfYear() restituisce risultati dispari

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

Risultati

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 

per quanto ho capito, non ci dovrebbe essere una settimana 53 nel 2007 e nel 2012, ma i giorni dovrebbero essere inclusi nella settimana 1. esiste un modo per modificare questo comportamento nel Calendar?

+2

"I giorni dovrebbero essere inclusi nella settimana 1": secondo quale regola? Secondo le regole che conosco, gli ultimi giorni dell'anno non fanno mai parte della prima settimana del prossimo anno ... –

+3

Secondo ISO 8601. http://en.wikipedia.org/wiki/ISO_8601 – sshow

+0

BTW, perché stai usando quel formato di data strano? Penso di non aver mai visto le date scritte come "2007.12.29". – svick

risposta

12

Il documentation for the CalendarWeekRule enumeration afferma esplicitamente che essa "non viene associato direttamente a ISO 8601" e collegamenti a ISO 8601 Week of Year format in Microsoft .Net, un post di blog che descrive le differenze.

+0

Questo spiega tutto. Grazie – sshow

+7

Non voglio nemmeno guardare la soluzione alternativa. La mia semplice domanda è: perché? Chi ne beneficia? Perché * leggermente * cambia in modo da dover scegliere due date su dieci per vedere una differenza? Un po 'frustrante ... – Piddu

0

Non ci devono essere 52 settimane per gli identificatori della settimana in modo univoco, non è necessario avere 7 giorni in una particolare settimana.

Se questo è un problema per voi quindi aggiungere il codice per gestire il caso limite.

1

Dai un'occhiata ai valori di CalendarWeekRule. Si sta utilizzando FirstFourDayWeek e quindi si stanno ottenendo i valori che si descrivono. Se desideri che ogni settimana abbia esattamente 7 giorni, devi utilizzare FirstFullWeek.

Nel tuo caso, ciò significherebbe che 31. 12. 2007 sarà Settimana 53, ma così sarà 2. 1. 2008.

+1

Tale soluzione non è conforme alla ISO 8601, poiché * la prima settimana con la maggioranza (quattro o più) dei suoi giorni nell'avvio anno [è la settimana 1] * – sshow