2010-10-04 16 views
6

Ich kann nicht einen Weg (mit Klassen-Definitionen), um vor Monaten zu bekommen. Sekunden, Tage und Minuten sind alle in Ordnung, weil sie immer Konstanten sind. Da aber Monate nicht immer konstant sind, muss ich einen Weg finden, wie Ruby wissen kann, wie viele Tage im aktuellen Monat sind.Vor Monaten in Ruby

+0

Beachten Sie, dass die Anzahl der Sekunden an einem Tag nicht konstant ist (Sommerzeit) –

+1

Es gibt auch Schaltsekunden, wenn wir wirklich pedantisch sein wollen, was durch Schaltstunden ersetzt werden könnte. Keines davon sollte mit Springfröschen verwechselt werden. http://en.wikipedia.org/wiki/Leap_second –

Antwort

0

Ist das wonach Sie suchen? DaysIn(MonthNum)

+0

Ich denke * was er sucht (indem er sagt "vor Monaten") ist mehr wie Oracles 'months_between' Funktion, die die Anzahl der Monate zurückgibt (als dezimal) zwischen zwei Datumswerten. Es berücksichtigt die unterschiedlichen Monatslängen. http://www.techonthenet.com/oracle/functions/months_between.php – FrustratedWithFormsDesigner

1

Wenn Sie wissen müssen, wie viele Tage es zwischen zwei Terminen waren, sagen heute und noch am selben Tag Nummer des letzten Monats, dies zu tun:

(Date.today - Date.today.prev_month).to_i 

Dies würde Ihnen die Anzahl der Tage des Vormonats. Wenn Sie die Anzahl der Tage für den aktuellen Monat wissen wollen, können Sie stattdessen tun:

(Date.today.next_month - Date.today).to_i 
+0

Das ist falsch. Der erste Fall scheitert zum Beispiel am 31. März. Dies wird 31 zurückgeben, jedoch im Februar (das ist voriger Monat bis März) kann nie mehr als 29 Tage sein.

irb(main):013:0> today = Date.parse '2011-03-31' => # irb(main):014:0> (today - today.prev_month).to_i => 31
DNNX

+0

Sehr wahr, ich wusste nicht, dass Date # prev_month den letzten Tag des vorherigen Monats für jeden Tag mit einer Zahl größer als die Nummer des letzten Tages des vorherigen Monats (zB für 31. März, 30 , 29 und 28 #prev_month gibt den 28. Februar zurück. – Theo

8

Wenn Ihre Anwendung Active (zB einer Rails-Anwendung), können Sie

3.months.ago 

verwenden das bekommen aktuelles Datum weniger als 3 Monate.

+7

Ohne ActiveSupport können Sie Date.today << 3 verwenden. – steenslag

+1

Der Schichtbetreiber ist super! Danke, dass Sie das zeigen. – phatmann

Verwandte Themen