2012-04-11 10 views
8

Ho seguente codice per ottenere il weeknumber del dato anno nel tempo oggetto DateTimesettimana dell'anno C# Datetime

public static int WeeksInYear(DateTime date) 
    { 
     GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized); 
     return cal.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
    } 

Ora io do la funzione wich data 1/1/2012 deve restituire settimana 1, ma hes che ritorna la settimana 52. E non riesco a capire perché. Qualcuno ha un'idea del perché?

+0

prova con questo 'cal.GetWeekOfYear (data, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday)' – Raghuveer

+0

@RaghuveerGuthikonda: Che sarebbe lavorare solo in questo caso particolare. Per esempio. L'1/1/2013 potrebbe essere un sabato, non funzionerà. È solo il modo in cui vengono calcolate le settimane di calendario. L'1/1/2012 è nella settimana 52 e dovrebbe essere lì. – basti

risposta

8

L'algoritmo sta eseguendo esattamente ciò che è stato richiesto. Hai il set di CalanderWeek impostato su FirstFourDayWeek. Il 1 ° gennaio 2012 non faceva parte della prima settimana di quattro giorni, quindi hai istruito il calendario per iniziare a contare dal 2 gennaio.

Calculate date from week number

0

Suppongo che perché 1/1/2012 è stata una Domenica e GetWeekOfYear dice che restituisce la settimana che comprende la data, è restituendo l'ultima settimana del 2011, piuttosto che la prima settimana del 2012.

Dai uno sguardo allo CalendarRule per chiarimenti.

0

1/1/2012 era domenica. Credo che sia per questo che ne prendi 52, perché era l'ultimo giorno della settimana scorsa. Per il 2 gennaio dovresti ottenere il risultato giusto.

1

Il numero della settimana è stato calcolato correttamente. Dovresti leggere come vengono calcolati/contati i numeri delle settimane (Wikipedia ?!).

Attenzione: il calcolo integrato del calcolo del numero di settimana è buggato. Microsoft descrive il problema nello KnowledgeBase-Article 200299. Ha problemi con ISO-8601.

1

È possibile utilizzare la classe Settimana del Time Period Library for .NET che supporta supporta l'ISO 8601 settimane di numerazione:

TimeCalendar calendar = new TimeCalendar(
    new TimeCalendarConfig { YearWeekType = YearWeekType.Iso8601 }); 
Week week = new Week(new DateTime(2012, 01, 01), calendar); 
Console.WriteLine("week #: ", week.WeekOfYear); 
4
public static int WeeksInYear(DateTime date) 
{ 
    GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized); 
    return cal.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Monday); 

Penso che se il cambiamento CalendarWeekRule.FirstFourDayWeek a CalendarWeekRule.FirstDay poi questo funzionerà bene.

lo cambio quindi funziona correttamente.

Problemi correlati