Rubrik: Datum/Zeit und Timer · Datums- und Zeit-Funktionen | VB-Versionen: VB.NET | 19.07.07 |
Kalenderwoche korrekt ermitteln (VB.NET) Leider funktioniert die DatePart-Funktion in Bezug auf das Ermitteln der Kalenderwoche nicht korrekt. Dieser Tipp schafft Abhilfe. | ||
Autor: Dieter Otter | Bewertung: | Views: 54.371 |
www.tools4vb.de | System: WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Wie ermittelt man die Kalenderwoche eines beliebigen Datums? Nach ein bisschen Stöbern in der Online-Hilfe sollte dies mit der DatePart-Funktion kein Problem sein:
Dim nWeek As Integer nWeek = DatePart(DateInterval.WeekOfYear, vDate, _ FirstDayOfWeek.Monday, FirstWeekOfYear.FirstFourDays)
Zunächst glaubt man, dass die Kalenderwoche auch korrekt ermittelt wird:
' Beispiel: 22.03.04 Dim nWeek As Integer nWeek = DatePart(DateInterval.WeekOfYear, New Date(2004, 3, 22), _ FirstDayOfWeek.Monday, FirstWeekOfYear.FirstFourDays) MsgBox(nWeek) ' Ergebnis: 13 - KORREKT!
' Beispiel: 31.12.07 nWeek = DatePart(DateInterval.WeekOfYear, New Date(2007, 12, 31), _ FirstDayOfWeek.Monday, FirstWeekOfYear.FirstFourDays) MsgBox(nWeek) ' Ergebnis: 53 - FALSCH! Korrekt wäre 1 (Jahr 2008)!!!
' Beispiel: 29.12.03 nWeek = DatePart(DateInterval.WeekOfYear, New Date(2003, 12, 29), _ FirstDayOfWeek.Monday, FirstWeekOfYear.FirstFourDays) MsgBox(nWeek) ' Ergebnis: 53 - FALSCH! Korrekt wäre 1 (Jahr 2004)!!!
Fazit:
Solange es sich bei dem Datum nicht um die letzte Woche eines Jahres handelt, gibt die DatePart-Funktion die korrekten Kalenderwoche zurück.
Nachfolgender Tipp errechnet die Kalenderwoche auch dann korrekt, wenn es sich um die letzte Woche eines Kalenderjahres handelt.
Public Function DateToWeek(ByVal dDate As Date) As String ' Startdatum der ersten Kalenderwoche des Jahres und Folgejahres berechnen Dim dThisYear As Date = CalendarWeek(1, dDate.Year) Dim dNextYear As Date = CalendarWeek(1, dDate.Year + 1) ' Prüfen, ob Datum zur ersten Woche des Folgejahres gehört If dDate >= dNextYear Then ' Rückgabe: KW 1 des Folgejahres Return dDate.Year + 1 & "01" ElseIf dDate < dThisYear Then ' Falls das Datum noch zu einer KW aus dem letzten Jahr zählt Return dDate.Year - 1 & DatePart(DateInterval.WeekOfYear, _ New Date(dDate.Year - 1, 12, 28), FirstDayOfWeek.Monday, _ FirstWeekOfYear.FirstFourDays) Else ' KW = Differenz zum ersten Tag der ersten Woche Return dDate.Year & Format$(dDate.Subtract(dThisYear).Days \ 7 + 1, "00") End If End Function
Die Funktion "CalendarWeek" finden Sie hier:
Datum einer bestimmten Kalenderwoche ermitteln
Beispiel:
' Beispiel: 31.12.07 Dim sKW As String = DateToWeek(CDate("31.12.07")) ' Ergebnis: 01/2008 - KORREKT! MsgBox(sKW.Substring(4, 2) & "/" & sKW.Substring(0, 4))