Хорошо, как насчет этого:
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
??