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 ageMethode 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 dob2004/2/28 und today2014/2/28 ist, agewird 2014 - 2004oder sein 10. Die Schwimmer werden 0228und sein 0229. b4bdaywird "0228" < "0229"oder sein true. Schließlich werden wir subtrahieren 1aus ageund 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 b4bdayLeitung ist zu lang. Das 2016Jahr 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
👍🏼