Copying sources and texts (also in parts) for publishing without our permission is NOT ALLOWED. We are fed up with finding our work on other sites (like stackoverflow).
Das Kopieren von Quellcode und Texten (auch in Auszügen) ist nicht erlaubt. Wir haben es gründlich satt, unsere Arbeit auf anderen Webseiten zu finden.

Copying for non-public usage is allowed.           Das private Kopieren und Benutzen ist natürlich erlaubt und erwünscht.
30. Aug 2009
Teaser

Ruby on Rails: Datum aus Kalenderwoche, Jahreszahl und Wochentag berechnen

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

fünf × 1 =