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