Хорошо, что насчет этого:
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 и today
2014/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
👍🏼