Zunächst wird ein Datumsobjekt erstellt, dass auf den 1. Januar des Jahres zeigt.
date = Date.parse("01-01-"+year)
Dann wird an Hand der Tageszahl (Montag == 1) der Offset berechnet.
if date.cwday <= 4
# Donnerstag oder kleiner: Zurueck rechnen auf Montag
x = -8 + (date.cwday+1);
else
# Offset auf Folge-Woche
x = 8 - date.cwday
end
Mit einer kleinen Hilfsfunktion wird der Offset bezüglich des gewünschten Wochentages angepasst.
x += day_number(day_string) - 1
Zu guter letzt wird das Datum berechnet.
date + x + ( 7*(week-1) )
Hier der komplette Code:
# Berechnet das Datum zu einem Wochentag in einer Kalenderwoche in einem Jahr
def week_to_date(week, year, day_string)
# Datums Objekt des ersten Jahrestages
date = Date.parse("01-01-"+year)
# Pruefen des nummerischen Wertes des Wochentages
# 4: Donnerstag - 1. KW ist die Woche mit dem ersten Donnerstag im Jahr
if date.cwday <= 4
# Donnerstag oder kleiner: Zurueck rechnen auf Montag
x = -8 + (date.cwday+1);
else
# Offset auf Folge-Woche
x = 8 - date.cwday
end
# Offset an Wochentag anpassen
x += day_number(day_string) - 1
# Datum berechnen aus 1.1. des Jahres + Offset + Anzahl der Wochen
date + x + ( 7*(week-1) )
end
def day_number(day_string)
days = {
'Mo' => 1,
'Di' => 2,
'Mi' => 3,
'Do' => 4,
'Fr' => 5,
'Sa' => 6,
'So' => 7
}
days[day_string]
end