Ich möchte das Alter einer Person von ihrem Geburtstag an erhalten. now - birthday / 365
funktioniert nicht, weil einige Jahre 366 Tage haben. Ich habe mir den folgenden Code ausgedacht:
now = Date.today
year = now.year - birth_date.year
if (date+year.year) > now
year = year - 1
end
Gibt es einen rubinroteren Weg, um das Alter zu berechnen?
ruby-on-rails
ruby
Mantas
quelle
quelle
Antworten:
Ich weiß, dass ich zu spät zur Party komme, aber die akzeptierte Antwort wird schrecklich brechen, wenn ich versuche, das Alter von jemandem herauszufinden, der am 29. Februar in einem Schaltjahr geboren wurde. Dies liegt daran, dass der Aufruf zum
birthday.to_date.change(:year => now.year)
Erstellen eines ungültigen Datums.Ich habe stattdessen den folgenden Code verwendet:
quelle
true
||false
?Ich habe festgestellt, dass diese Lösung gut funktioniert und für andere Menschen lesbar ist:
Einfach und Sie müssen sich keine Gedanken über die Handhabung des Schaltjahres und dergleichen machen.
quelle
Date.today.month < birthday.month or Date.today.month == birthday.month && Date.today.mday < birthday.mday
.Benutze das:
quelle
rails/activesupport
.Ein Liner in Ruby on Rails (ActiveSupport). Behandelt Schaltjahre, Schaltsekunden und alles.
Logik von hier - Berechnen Sie das Alter in C #
Angenommen, beide Daten befinden sich in derselben Zeitzone, wenn Sie nicht beide
utc()
vorher anrufento_s()
.quelle
(Date.today.to_s(:number).to_i - birthday.to_date.to_s(:number).to_i)/1e4.to_i
funktioniert auchquelle
Die bisherigen Antworten sind irgendwie komisch. Ihr ursprünglicher Versuch war ziemlich nah am richtigen Weg, dies zu tun:
Sie erhalten ein gebrochenes Ergebnis. Sie können das Ergebnis also in eine Ganzzahl mit konvertieren
to_i
. Dies ist eine bessere Lösung, da die Datumsdifferenz korrekt als Zeitraum in Tagen (oder Sekunden im Fall der zugehörigen Zeitklasse) seit dem Ereignis behandelt wird. Dann gibt Ihnen eine einfache Division durch die Anzahl der Tage in einem Jahr das Alter. Wenn Sie das Alter in Jahren auf diese Weise berechnen, müssen Schaltjahre nicht berücksichtigt werden, solange Sie den ursprünglichen DOB-Wert beibehalten.quelle
birthday = DateTime.now - 1.year
gibt mir ein Alter von 0. Leider ist das Teilen durch 365,25 etwas ungenau.Mein Vorschlag:
Der Trick ist, dass die Minusoperation mit Time Sekunden zurückgibt
quelle
Ich mag dieses:
quelle
Diese Antwort ist die beste, stimmen Sie sie stattdessen ab.
Ich mag die Lösung von @ philnash, aber die Bedingung könnte compacter sein. Dieser boolesche Ausdruck vergleicht [Monat, Tag] -Paare in lexikografischer Reihenfolge , sodass man stattdessen einfach den String-Vergleich von Ruby verwenden kann:
quelle
(Date.today.strftime('%Y%m%d').to_i - dob.strftime('%Y%m%d').to_i) / 10000
?Dies ist eine Konvertierung dieser Antwort (sie hat viele Stimmen erhalten):
Es ist definitiv einzigartig in seiner Herangehensweise, macht aber durchaus Sinn, wenn Sie erkennen, was es tut:
quelle
Da Ruby on Rails markiert ist, die dotiw überschreibt gem die Rails integrierten in distance_of_times_in_words und bietet distance_of_times_in_words_hash , die verwendet werden können , das Alter zu bestimmen. Schaltjahre werden für den Teil der Jahre gut gehandhabt, obwohl zu beachten ist, dass der 29. Februar einen Einfluss auf den Teil der Tage hat, der Verständnis erfordert, wenn dieser Detaillierungsgrad benötigt wird. Wenn Ihnen nicht gefällt, wie dotiw das Format von distance_of_time_in_words ändert, verwenden Sie die Option: vague, um zum ursprünglichen Format zurückzukehren.
Füge dotiw zur Gemfile hinzu:
In der Befehlszeile:
Fügen Sie den DateHelper in das entsprechende Modell ein, um Zugriff auf distance_of_time_in_words und distance_of_time_in_words_hash zu erhalten. In diesem Beispiel lautet das Modell "Benutzer" und das Feld "Geburtstag" lautet "Geburtstag".
Fügen Sie diese Methode demselben Modell hinzu.
Verwendung:
quelle
Ich glaube, dies entspricht funktional der Antwort von @ philnash, aber IMO ist leichter verständlich.
Verwendung:
quelle
Das Folgende scheint zu funktionieren (aber ich würde es begrüßen, wenn es aktiviert wäre).
quelle
Wenn Sie sich nicht für ein oder zwei Tage interessieren, wäre dies kürzer und ziemlich selbsterklärend.
quelle
Ok was ist damit:
Dies setzt voraus, dass wir Rails verwenden, die
age
Methode für ein Modell aufrufen und das Modell über eine Datumsdatenbankspalte verfügtdob
. Dies unterscheidet sich von anderen Antworten, da bei dieser Methode mithilfe von Zeichenfolgen festgestellt wird, ob wir vor dem diesjährigen Geburtstag sind.Wenn zum Beispiel
dob
2004/2/28 undtoday
2014/2/28 ist,age
wird2014 - 2004
oder sein10
. Die Schwimmer werden0228
und sein0229
.b4bday
wird"0228" < "0229"
oder seintrue
. Schließlich werden wir subtrahieren1
ausage
und erhalten9
.Dies wäre der normale Weg, um die beiden Zeiten zu vergleichen.
Dies funktioniert genauso, aber die
b4bday
Leitung ist zu lang. Das2016
Jahr ist auch unnötig. Der Stringvergleich am Anfang war das Ergebnis.Sie können dies auch tun
Wenn Sie keine Schienen verwenden, versuchen Sie dies
👍🏼
quelle
Ich denke, es ist viel besser, keine Monate zu zählen, weil man mit genau den Tag eines Jahres ermitteln kann
Time.zone.now.yday
.quelle
Kam mit einer Rails-Variante dieser Lösung
quelle
DateHelper kann nur verwendet werden, um Jahre abzurufen
quelle
quelle
quelle
quelle
Um Schaltjahre zu berücksichtigen (und die aktive Unterstützung zu übernehmen):
years_since
ändert das Datum korrekt, um Nicht-Schaltjahre (wenn Geburtstag ist02-29
) zu berücksichtigen .quelle
Hier ist meine Lösung, mit der auch das Alter zu einem bestimmten Zeitpunkt berechnet werden kann:
quelle
Ich musste mich auch damit befassen, aber monatelang. Wurde viel zu kompliziert. Der einfachste Weg, den ich mir vorstellen konnte, war:
Sie könnten das gleiche mit 12 Monaten tun:
Dies verwendet die Datumsklasse, um den Monat zu erhöhen, der 28 Tage und Schaltjahre usw. behandelt.
quelle