Получите возраст человека в Ruby

Используйте одиночные символы '%' в строке формата. Вы избежали их, поэтому ничто не может быть заменено.

122
задан Peter Mortensen 20 April 2011 в 14:21
поделиться

6 ответов

Я знаю, что опаздываю на вечеринку, но принятый ответ ужасно сломается при попытке вычислить возраст человека, родившегося 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
404
ответ дан 24 November 2019 в 01:18
поделиться

Используйте это:

def age
  now = Time.now.utc.to_date
  now.year - birthday.year - (birthday.to_date.change(:year => now.year) > now ? 1 : 0)
end
33
ответ дан 24 November 2019 в 01:18
поделиться

Пока ответы странные. Ваша первоначальная попытка была довольно близка к правильному способу сделать это:

birthday = DateTime.new(1900, 1, 1)
age = (DateTime.now - birthday) / 365.25 # or (1.year / 1.day)

Вы получите дробный результат, поэтому не стесняйтесь конвертировать результат в целое число с to_i . Это лучшее решение, поскольку оно правильно обрабатывает разницу дат как период времени, измеренный в днях (или секундах в случае соответствующего класса времени) с момента события. Тогда простое деление на количество дней в году дает вам возраст. Таким образом, при расчете возраста в годах, пока вы сохраняете исходное значение DOB, не нужно делать поправку на високосные годы.

6
ответ дан 24 November 2019 в 01:18
поделиться

Я нашел, что это решение хорошо работает и доступно для чтения другими людьми:

    age = Date.today.year - birthday.year
    age -= 1 if Date.today < birthday + age.years #for days before birthday

Легко, и вам не нужно беспокоиться о том, как справиться с високосным годом и тому подобным.

49
ответ дан 24 November 2019 в 01:18
поделиться

Похоже, что следующее работает (но я был бы признателен, если бы это было проверено).

age = now.year - bday.year
age -= 1 if now.to_a[7] < bday.to_a[7]
0
ответ дан 24 November 2019 в 01:18
поделиться
  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
-1
ответ дан 24 November 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: