Kalenderwoche berechnen
Verfasst: 04.05.2021 16:19
Weil ich hier im Forum nichts passendes gefunden habe, habe ich mal eine kleine Procedure geschrieben, die die Kalenderwoche zu einem gegebenen Datum berechnen kann. Dabei habe ich den Code möglichst kurz und effizient gehalten. Die ausführlichen Kommentare sollten es aber einfach machen die Berechnung nachzuvollziehen.
.
.
.
Code: Alles auswählen
EnableExplicit
Procedure.b WeekOfYear(Datum.l)
; * Berechnung der Kalenderwoche zu einem gegebenen Datum.
; * Das Datum muss zwischen dem 01.01.1970 und 31.12.2037 liegen.
; * Die Berechnung erfolgt nach DIN 1355/ISO 8601, d.h. der erste Tag der Woche ist Montag und
; * die erste Kalenderwoche im Jahr ist die Woche, in die mindestens vier Tage des neuen Jahres fallen.
; * Wenn nicht mehr als drei Tage vom Jahr in der letzten Woche liegen,
; * zählen diese Woche zur ersten Kalenderwoche des Folgejahres.
Protected DoW = DayOfWeek(Datum)
Protected Tag.w = Day(Datum)
Protected KalWo.b
; Die Nummern für jeden Wochentag um einen Tag verschieben
; weil der Montag nach DIN der erste Wochentag ist.
If DoW = 0 : DoW = 7 : EndIf : DoW - 1 ; Mo = 0 ... So = 6
; Die Tage der angebrochenen Woche auffüllen und den Wert
; danach durch 7 teilen um die aktuelle Woche zu bestimmen.
; Der Umschaltpunkt für die neue Woche ist dann immer der Montag.
KalWo = (DayOfYear(Datum) - DoW + 6) / 7
; Wenn der 1.1. des gegebenen Jahres auf einen Di., Mi. oder Do. fällt muss
; eine Woche addiert werden weil diese Woche dann als erste Woche gilt.
; (Wenn der 1.1. ein Mo. ist gilt diese Woche natürlich auch als erste Woche. Dann wurde
; diese Woche aber schon bei der Integerdivision in der Zeile zuvor berücksichtigt.)
Select DayOfWeek(Date(Year(Datum), 1, 1, 0, 0, 0))
Case 2, 3, 4
KalWo + 1
EndSelect
; Wenn das gegebene Datum im Dezember liegt fällt es nur bei den folgenden
; Tag- Wochentagkombinationen in die erste Kalenderwoche des Folgejahres.
; 29. And Mo
; 30. And (Mo Or Di)
; 31. And (Mo Or Di Or Mi)
If Month(Datum) = 12
If (Tag = 29 And DoW = 0) Or (Tag = 30 And DoW < 2) Or (Tag = 31 And DoW < 3)
KalWo = 1
EndIf
EndIf
ProcedureReturn KalWo
EndProcedure
Debug "Kalenderwoche: " + Str(WeekOfYear(Date(2020, 12, 28, 0, 0, 0)))