2016-05-10 7 views
1

Also bin ich neu in Ruby und nicht vertraut mit der Syntax des Date Juwel, aber gibt es ein So finden Sie das Datum eines Wanderurlaubs wie den Vatertag?Wie finde ich die Datumsangabe für das Jahr, den Monat, den Wochentag und die Woche in Ruby

So sieht meine aktuelle Klasse für die beweglichen Feiertage wie folgt aus:

class MovingHoliday < Holiday 
    def initialize (name, month, day_of_week, week, year=2016) 
     @name = name 
     @month = month 
     @day_of_week = day_of_week 
     @week = week 
     @year = year 
     @my_date = Date.new(year, month, day) 
    end 
end 

und meine Eingabe sieht wie folgt aus:

fathers_day = MovingHoliday.new("Fathers Day", 6, "sunday", 4, year) 

Die 6 ist der Monat, „Sonntag“ ist auch die Tag_der_Woche und 4 ist die Woche, auf die es fällt. Ich kann einfach nicht die Syntax herausfinden, wenn es dafür eine Konvertierung geben würde/könnte. Und ich kann keine anderen Edelsteine ​​als Rubys Date verwenden.

+0

Sie meinen den Ruby-Kern [Date library] (http://ruby-doc.org/stdlib-2.3.1/libdoc/date/rdoc/Date.html)? – tadman

+1

Ich denke du meinst '@my_date ='? Andernfalls ist 'my_date' eine lokale Variable, die beim Beenden der Methode verloren geht. –

+0

Ja, dein Recht, danke.^behoben – Alex

Antwort

3
class MovingHoliday < Holiday 
    def initialize (name, month, day_of_week, week, year=2016) 
     @name = name 
     @month = month 
     @day_of_week = day_of_week 
     @week = week 
     @year = year 
     @my_date = Date.new(year, month, 1) 
     @my_date += 1 while !my_date.send("#{day_of_week}?") 
     @my_date += (7 * (week - 1)) 
    end 
end 

Nicht schön, aber es funktioniert. Es dauert den ersten des Monats, bewegt sich einen Tag nach oben, bis es der richtige Tag der Woche ist, und erhöht sich dann um die entsprechende Anzahl von Wochen.

So wie es aussieht, wird davon ausgegangen, dass Sie einen tatsächlichen Wochentag erhalten. Sie werden wahrscheinlich die Eingabe in irgendeiner Weise bereinigen oder konvertieren von "Sonntag" auf 0 (my_date.wday gibt 0 für Sonntag, 1 für Montag, etc.)

+0

Ich empfehle, diese Berechnung in eine separate Methode zu extrahieren. –

+0

Einverstanden. Dies ist mehr für das Konzept. Das Ergebnis wird nicht gespeichert, bevor die Methode beendet wird. –

+0

Ok! aber eine frage ist was macht das who '! x.send'? – Alex

1

date in Ruby ist kein Juwel, es ist Teil von die Standard-Bibliothek, es ist nur nicht geladen, es sei denn Sie require es. (In Ruby wird require für beide Zwecke verwendet, Laden von Edelsteinen und Laden von Teilen der Standardbibliothek, die standardmäßig nicht geladen werden.)

Ich kenne keine integrierte Funktionalität, die das Datum für Sie berechnen würde Ich denke, du müsstest das selbst schreiben, da du keine anderen Edelsteine ​​in Betracht ziehen willst.

+0

Danke für die Korrektur und Erklärung – Alex

Verwandte Themen