Хорошо, что насчет этого:
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
Предполагается, что мы используем рельсы, вызываем ageметод в модели, а модель имеет столбец базы данных даты dob. Это отличается от других ответов, потому что этот метод использует строки, чтобы определить, дожили ли мы до дня рождения в этом году.
Например, если dobэто 2004/2/28 и today2014/2/28, ageбудет 2014 - 2004или 10. Поплавки будут 0228и 0229. b4bdayбудет "0228" < "0229"или true. Наконец, мы будем вычитать 1из ageи получить 9.
Это был бы нормальный способ сравнить два раза.
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
Это работает так же, но b4bdayлиния слишком длинная. 2016Год также не требуется. Результатом было сравнение строк в начале.
Вы также можете сделать это
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
Если вы не используете рельсы, попробуйте это
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
👍🏼