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