Ok was ist damit:
def age
return unless dob
t = Date.today
age = t.year - dob.year
b4bday = t.strftime('%m%d') < dob.strftime('%m%d')
age - (b4bday ? 1 : 0)
end
Dies setzt voraus, dass wir Rails verwenden, die age
Methode für ein Modell aufrufen und das Modell über eine Datumsdatenbankspalte verfügt dob
. 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 und today
2014/2/28 ist, age
wird 2014 - 2004
oder sein 10
. Die Schwimmer werden 0228
und sein 0229
. b4bday
wird "0228" < "0229"
oder sein true
. Schließlich werden wir subtrahieren 1
aus age
und erhalten 9
.
Dies wäre der normale Weg, um die beiden Zeiten zu vergleichen.
def age
return unless dob
t = Date.today
age = today.year - dob.year
b4bday = Date.new(2016, t.month, t.day) < Date.new(2016, dob.month, dob.day)
age - (b4bday ? 1 : 0)
end
Dies funktioniert genauso, aber die b4bday
Leitung ist zu lang. Das 2016
Jahr ist auch unnötig. Der Stringvergleich am Anfang war das Ergebnis.
Sie können dies auch tun
Date::DATE_FORMATS[:md] = '%m%d'
def age
return unless dob
t = Date.today
age = t.year - dob.year
b4bday = t.to_s(:md) < dob.to_s(:md)
age - (b4bday ? 1 : 0)
end
Wenn Sie keine Schienen verwenden, versuchen Sie dies
def age(dob)
t = Time.now
age = t.year - dob.year
b4bday = t.strftime('%m%d') < dob.strftime('%m%d')
age - (b4bday ? 1 : 0)
end
👍🏼