Используйте одиночные символы '%' в строке формата. Вы избежали их, поэтому ничто не может быть заменено.
Я знаю, что опаздываю на вечеринку, но принятый ответ ужасно сломается при попытке вычислить возраст человека, родившегося 29 февраля в високосный год. Это потому, что вызов birthday.to_date.change (: year => now.year)
создает недопустимую дату.
Вместо этого я использовал следующий код (в проекте Rails):
def age(dob)
now = Time.now.utc.to_date
now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
end
Используйте это:
def age
now = Time.now.utc.to_date
now.year - birthday.year - (birthday.to_date.change(:year => now.year) > now ? 1 : 0)
end
Пока ответы странные. Ваша первоначальная попытка была довольно близка к правильному способу сделать это:
birthday = DateTime.new(1900, 1, 1)
age = (DateTime.now - birthday) / 365.25 # or (1.year / 1.day)
Вы получите дробный результат, поэтому не стесняйтесь конвертировать результат в целое число с to_i
. Это лучшее решение, поскольку оно правильно обрабатывает разницу дат как период времени, измеренный в днях (или секундах в случае соответствующего класса времени) с момента события. Тогда простое деление на количество дней в году дает вам возраст. Таким образом, при расчете возраста в годах, пока вы сохраняете исходное значение DOB, не нужно делать поправку на високосные годы.
Я нашел, что это решение хорошо работает и доступно для чтения другими людьми:
age = Date.today.year - birthday.year
age -= 1 if Date.today < birthday + age.years #for days before birthday
Легко, и вам не нужно беспокоиться о том, как справиться с високосным годом и тому подобным.
Похоже, что следующее работает (но я был бы признателен, если бы это было проверено).
age = now.year - bday.year
age -= 1 if now.to_a[7] < bday.to_a[7]
def birthday(user)
today = Date.today
new = user.birthday.to_date.change(:year => today.year)
user = user.birthday
if Date.civil_to_jd(today.year, today.month, today.day) >= Date.civil_to_jd(new.year, new.month, new.day)
age = today.year - user.year
else
age = (today.year - user.year) -1
end
age
end