47 Stimmen

Berechnen Sie die Differenz in Tagen ActiveSupport:TimeWithZone in der meisten "rubyish" Stil?

Ich habe das Gefühl, dass mich jemand auf eine andere Frage hinweisen wird, die diese Frage beantwortet, aber ich habe bei dieser einfachen Frage vergeblich gesucht.

Ich habe einen Activerecord mit einer datetime-Eigenschaft. Er wird als ActiveSupport:TimeWithZone zurückgegeben. Ich weiß, dass ich das nicht mit DateTime.now vergleichen kann, weil das keine Zone enthält, also muss ich Time.zone verwenden. Das macht Sinn.

Ich frage mich, ob es stilistisch einen "saubereren" Weg gibt, dies zu tun, als das Ergebnis zu subtrahieren und durch 86400 zu teilen?

Ich tue Folgendes:

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i

Es funktioniert, aber es sieht nicht sehr rosig aus, und ich habe das Gefühl, dass ich etwas vermisse. Sollte ich Casting, Vergleich oder konvertieren eine andere Route oder ist dies wirklich der typische Weg, dies in Rails zu tun? Ich freue mich über jeden Tipp oder einen Link zu einer Frage, die dies bereits abdeckt.

Dankeschön

0 Stimmen

Wollen Sie am Ende Worte ausgeben?

0 Stimmen

Ich bin darauf beschränkt, dies in einem Modell im Moment zu tun, so dass ich nicht die Vorteile der time_ago_in_words-Helfer nutzen kann. Ich nehme nur den int-Wert zurück zu einer Client-Anwendung. Vielen Dank für das Feedback alle.

92voto

Jakub Hampl Punkte 38490

Um die Lesbarkeit zu verbessern, können Sie Folgendes tun:

((Time.zone.now - myActiveRecord.visit_date) / 1.day).to_i

Edit :

Eigentlich kann man einen Satz der Klammern mit loswerden:

(Time.zone.now - myActiveRecord.visit_date).to_i / 1.day

0 Stimmen

Hierfür gibt es eine Methode, die ich weiter unten erwähne.

0 Stimmen

(Time.zone.now - 3.days.ago).to_i / 1.day wird ausgegeben 2

1 Stimmen

Das funktioniert nicht immer. Ich musste es stattdessen tun: (myActiveRecord.end_date.to_datetime.to_i - Time.now.to_i)/1.day

20voto

Aaron Punkte 11987

Ich weiß, dass diese Frage etwas veraltet ist, aber ich bin beim Googeln nach einem ähnlichen Problem darauf gestoßen. In meinem Fall wollte ich den Unterschied zwischen ganzen Tagen auf der Makro- und Mikroebene wissen.

Ich brauchte zum Beispiel einen Code, der mir sagt, dass der 31. Dezember 2010 366 Tage vor dem 1. Januar 2012 liegt und dass der 31. Dezember 2010 23:59 Uhr einen Tag vor dem 1. Januar 2011 00:00 Uhr liegt. Die obige Methode funktioniert im ersten Fall, aber im zweiten Fall sagt sie, dass sie 0 Tage voneinander entfernt sind.

Am Ende habe ich die Ruby-Funktion Date Klasse, um für mich zu rechnen. Mit dem Code oben sieht meine Methode wie folgt aus:

(Time.zone.now.to_date - myActiveRecord.visit_date.to_date).to_i

Dies funktioniert mit Eingaben in Time o DateTime aufgrund der Umstellung. Eine andere mögliche Lösung wäre, zunächst die beginning_of_day auf jeder der Times o DateTimes aber in meinem Fall war das Protokoll wichtig.

4voto

jamesconant Punkte 1375

Rails hat eine Methode für genau diese Art von Dingen eingebaut.

Zur Kasse #zeit_zur_zeit_in_wörtern

Also, für den ursprünglichen Fall...

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i

gegen

time_ago_in_words(myActiveRecord.visit_date)

0 Stimmen

Diese Methode gibt eine menschenlesbare Zeichenkettenbeschreibung zurück, nicht den tatsächlichen numerischen Unterschied.

1 Stimmen

Die Herabstufung ist unnötig. Dies ist nicht die am besten Antwort, aber es ist auch keine falsche Antwort. Im Zusammenhang mit dem gesamten Beitrag enthält diese Antwort sogar eine Technik, die man kennen sollte.

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