2012-04-11 19 views
8

Mam następujący kod aby otrzymać weeknumber roku nadane w czasach obiektu DateTimeTydzień Roku C# Datetime

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

Teraz daję funkcja data 01.01.2012 wich powinien powrócić tygodnie 1, ale on wraca w tygodniu 52. I nie mogę się domyślić dlaczego. Ktoś ma pomysł, dlaczego?

+0

spróbować z tym 'cal.GetWeekOfYear (data, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday)' – Raghuveer

+0

@RaghuveerGuthikonda: To będzie działać tylko w tym szczególnym przypadku. E. g. 01.01.2013 może być w sobotę, to nie zadziała. Po prostu oblicza się tygodnie kalendarzowe. 1/1/2012 jest w 52. tygodniu i powinno tam być. – basti

Odpowiedz

8

Algorytm wykonuje dokładnie to, co polecono mu zrobić. Masz CalanderWeekRule ustawiony na FirstFourDayWeek. 1 stycznia 2012 roku nie był częścią pierwszego 4-dniowego tygodnia, więc poleciłeś kalandrowi, aby zaczął liczyć od 2 stycznia.

Calculate date from week number

0

Przypuszczam, że dlatego, 1.01.2012 była niedziela i GetWeekOfYear mówi zwraca tygodniu, który zawiera datę, to powrót w ostatnim tygodniu 2011 roku zamiast w pierwszym tygodniu 2012 roku

Aby uzyskać wyjaśnienia, spójrz na stronę CalendarRule.

0

1/1/2012 była niedziela. Uważam, że dlatego otrzymujesz 52, ponieważ był to ostatni dzień zeszłego roku. Na 2 stycznia powinieneś uzyskać odpowiedni wynik.

1

Numer tygodniowy został poprawnie obliczony. Powinieneś przeczytać, jak liczone są tygodniówki (Wikipedia ?!).

Uwaga: wbudowane obliczenia obliczania liczby tygodniowej są błędne. Microsoft opisuje problem w KnowledgeBase-Article 200299. Ma problemy z ISO-8601.

1

Można użyć klasy Tydzień z Time Period Library for .NET który obsługuje obsługuje ISO 8601 numeracji tygodniu:

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

myślę, że jeśli zmiana CalendarWeekRule.FirstFourDayWeek do CalendarWeekRule.FirstDay następnie to zadziała dobrze.

Zmieniam to, to działa poprawnie.