4 Stimmen

Erhalte die Anzahl der Elemente in einem Ruby-Bereich, der aus Zeitobjekten besteht

Wie kann ich die Größe oder Anzahl eines Bereichs aus Time-Objekten bekommen?

Etwas, das dasselbe Ergebnis wie mein Pseudo-Ruby-Code erzielen würde, der nicht funktioniert:

((Time.now.end_of_day - 31.days)..(Time.now.end_of_day - 1.day)).size == 30

Aktuell ergibt das obige einen Fehler:

NoMethodError: undefined method `size' for 2012-05-18 23:59:59 -0400..2012-06-17 23:59:59 -0400:Range

und beim Versuch, es in ein Array umzuwandeln (range).to_a :

kann nicht von Time iteriert werden

Update

Interessant, habe gerade versucht zu tun

((Date.today.end_of_day - 31.days)..(Date.today.end_of_day - 1.day)).count

Users/.../gems/ruby/1.9.1/gems/activesupport-3.0.15/lib/active_support/time_with_zone.rb:322: warning: Time#succ ist veraltet; verwenden Sie time + 1

Dennoch

((Date.today - 31.days)..(Date.today - 1.day)).count == 31

Würde das für dich auch in Ordnung sein?

Außerdem ((Date.today - 31.days)..(Date.yesterday)).count == 31

Update 2

Andererseits können wir, Mu's Hinweis folgend, auch Folgendes tun:

(((Time.now.end_of_day - 31.days)..(Time.now.end_of_day - 1.day)).first.to_date..((Time.now.end_of_day - 31.days)..(Time.now.end_of_day - 1.day)).last.to_date).count == 31

5voto

Lars Haugseth Punkte 14242

Es gibt keine Methode namens Range#size, versuchen Sie Range#count (wie von Andrew Marshall vorgeschlagen), obwohl es immer noch nicht für eine Reichweite von Time Objekten funktionieren wird.

Wenn Sie Tageberechnungen durchführen möchten, ist es besser, Date Objekte zu verwenden, entweder durch direkte Instantiierung (Date.today - 31 zum Beispiel) oder durch Aufruf von #to_date auf Ihren Time Objekten.

Date Objekte können auch für Iterationen verwendet werden:

((Date.today - 2)..(Date.today)).to_a
=> [#,
 #,
 #]

((Date.today - 2)..(Date.today)).map(&:to_s)
=> ["2012-06-17", "2012-06-18", "2012-06-19"]

4voto

Andrew Marshall Punkte 92252

Weil eine Größe für einen Datumsbereich keinen Sinn ergibt - es weiß nicht, ob Sie es als Tage, Minuten, Sekunden, Monate oder etwas anderes anzeigen möchten. Der Grund, warum der Fehler das Iterieren erwähnt, ist, dass es zur Bestimmung der Größe des Bereichs wissen muss, wie man über sie iteriert, damit es die Anzahl der Elemente zählen kann.

Da das, was Sie wollen, der Unterschied in Tagen ist, tun Sie einfach das:

date_one = Time.now.end_of_day - 31.days
date_two = Time.now.end_of_day - 1.day

((date_one - date_two) / 1.day).abs
#=> 30.0

Sie müssen durch 1.day teilen, da eine Differenz von Times Sekunden zurückgibt.

0voto

David Grayson Punkte 77766

Um überhaupt eine Chance zu haben, dass Ihr Code funktioniert, sollten Sie alles vor .size in Klammern setzen.

Statt eine Spanne zu verwenden, könnten Sie vielleicht einfach ein Zeitobjekt von einem anderen subtrahieren?

Ich weiß, dass Sie Bereiche aus Datumobjekten machen, also könnten Sie das umwandeln.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X