2012-04-11 7 views
8

Ich habe Code im Anschluss an die Wochennummer des Jahres, in der Datetime-Objekt ZeitWoche des Jahres C# für Datum und Uhrzeit

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

Nun ich der Funktion sollte das Datum 1.1.2012 weichen geben gegeben zu bekommen zurückzukehren Woche 1, aber hes Rückkehr Woche 52. Und ich kann nicht herausfinden, warum. Jeder hat eine Idee warum?

+0

versuchen mit diesem 'cal.GetWeekOfYear (Datum, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday)' – Raghuveer

+0

@RaghuveerGuthikonda: Das wäre nur in diesem speziellen Fall arbeiten. Z.B. 1/1/2013 könnte ein Samstag sein, es wird nicht funktionieren. Es ist genau so, wie Kalenderwochen berechnet werden. Das 1/1/2012 ist in Woche 52 und es sollte dort sein. – basti

Antwort

8

Der Algorithmus tut genau das, was Sie ihm angewiesen haben. Sie haben die CalanderWeekRule auf FirstFourDayWeek eingestellt. Der 1. Januar 2012 war nicht Teil der ersten viertägigen Woche, also hast du den Kalander angewiesen, ab dem 2. Januar zu zählen.

Calculate date from week number

0

Ich gehe davon aus, dass, weil 1.1.2012 war ein Sonntag und GetWeekOfYear sagt es die Woche gibt, die das Datum enthält, wird es die letzte Woche des Jahres 2011 statt der ersten Woche des Jahres 2012

Rückkehr

Werfen Sie einen Blick auf die CalendarRule zur Verdeutlichung.

0

01.01.2012 war es Sonntag. Ich glaube, deshalb bekommst du 52, weil es der letzte Tag der letzten Woche war. Für den 2. Januar sollten Sie das richtige Ergebnis erhalten.

1

Die Wochennummer wurde korrekt berechnet. Sie sollten lesen, wie Wochenzahlen tatsächlich berechnet/gezählt werden (Wikipedia ?!).

Achtung: Die eingebaute Berechnung der Wochenzahlberechnung ist fehlerhaft. Microsoft beschreibt das Problem in der KnowledgeBase-Article 200299. Es hat Probleme mit ISO-8601.

1

können Sie die Klasse verwenden Woche der Time Period Library for .NET, die die Nummerierung ISO 8601 Wochen unterstützt unterstützt:

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

ich denke, wenn eine Änderung CalendarWeekRule.FirstFourDayWeek zu CalendarWeekRule.FirstDay dann das wird gut funktionieren.

ich ändere das dann funktioniert es gut.

Verwandte Themen