Хочу узнать возраст человека с момента его рождения. now - birthday / 365
не работает, потому что в некоторых годах 366 дней. Я придумал следующий код:
now = Date.today
year = now.year - birth_date.year
if (date+year.year) > now
year = year - 1
end
Есть ли более рубиновый способ вычисления возраста?
ruby-on-rails
ruby
Манты
источник
источник
Ответы:
Я знаю, что опаздываю на вечеринку, но принятый ответ ужасно сломается, когда я попытаюсь определить возраст человека, родившегося 29 февраля в високосном году. Это потому, что вызов
birthday.to_date.change(:year => now.year)
создает недопустимую дату.Вместо этого я использовал следующий код:
источник
true
||false
?Я обнаружил, что это решение хорошо работает и читается другими людьми:
Легко, и вам не нужно беспокоиться об обработке високосного года и тому подобного.
источник
Date.today.month < birthday.month or Date.today.month == birthday.month && Date.today.mday < birthday.mday
.Использовать это:
источник
rails/activesupport
.Один лайнер в Ruby on Rails (ActiveSupport). Обрабатывает високосные годы, високосные секунды и все такое.
Логика отсюда - вычислить возраст на C #
Предполагая, что обе даты находятся в одном часовом поясе, если не звонить
utc()
раньшеto_s()
на обоих.источник
(Date.today.to_s(:number).to_i - birthday.to_date.to_s(:number).to_i)/1e4.to_i
тоже работаетисточник
Ответы пока довольно странные. Ваша первоначальная попытка была довольно близка к правильному способу сделать это:
Вы получите дробный результат, поэтому можете преобразовать результат в целое число с помощью
to_i
. Это лучшее решение, поскольку оно правильно обрабатывает разницу дат как период времени, измеряемый в днях (или секундах в случае связанного класса Time) с момента события. Тогда простое деление на количество дней в году даст вам возраст. При таком расчете возраста в годах, пока вы сохраняете исходное значение DOB, не нужно делать поправку на високосные годы.источник
birthday = DateTime.now - 1.year
дает мне возраст 0. К сожалению, деление на 365,25 немного неточно.Мое предложение:
Хитрость в том, что операция минус с Time возвращает секунды.
источник
Мне нравится этот:
источник
Это лучший ответ , проголосуйте за него.
Мне нравится решение @philnash, но условное выражение может быть более компактным. Это логическое выражение сравнивает пары [месяц, день] в лексикографическом порядке , так что вместо этого можно просто использовать сравнение строк в ruby:
источник
(Date.today.strftime('%Y%m%d').to_i - dob.strftime('%Y%m%d').to_i) / 10000
?Это преобразование этого ответа (он получил много голосов):
Это определенно уникально по своему подходу, но имеет смысл, когда вы понимаете, что он делает:
источник
Поскольку Ruby on Rails помечен тегами, гем dotiw переопределяет встроенное в Rails distance_of_times_in_words и предоставляет distance_of_times_in_words_hash который может использоваться для определения возраста. Високосные годы обрабатываются нормально для части лет, хотя имейте в виду, что 29 февраля действительно влияет на часть дней, которая требует понимания, нужен ли такой уровень детализации. Кроме того, если вам не нравится, как dotiw изменяет формат distance_of_time_in_words, используйте параметр: vague, чтобы вернуться к исходному формату.
Добавьте dotiw в Gemfile:
В командной строке:
Включите DateHelper в соответствующую модель, чтобы получить доступ к distance_of_time_in_words и distance_of_time_in_words_hash. В этом примере модель - «Пользователь», а поле дня рождения - «день рождения».
Добавьте этот метод к той же модели.
Использование:
источник
Я считаю, что это функционально эквивалентно ответу @ philnash, но ИМО легче понять.
Использование:
источник
Следующее, кажется, работает (но я был бы признателен, если бы это было проверено).
источник
Если вам наплевать на день или два, это будет короче и не требует пояснений.
источник
Хорошо, что насчет этого:
Предполагается, что мы используем рельсы, вызываем
age
метод в модели, а модель имеет столбец базы данных датыdob
. Это отличается от других ответов, потому что этот метод использует строки, чтобы определить, дожили ли мы до дня рождения в этом году.Например, если
dob
это 2004/2/28 иtoday
2014/2/28,age
будет2014 - 2004
или10
. Поплавки будут0228
и0229
.b4bday
будет"0228" < "0229"
илиtrue
. Наконец, мы будем вычитать1
изage
и получить9
.Это был бы нормальный способ сравнить два раза.
Это работает так же, но
b4bday
линия слишком длинная.2016
Год также не требуется. Результатом было сравнение строк в начале.Вы также можете сделать это
Если вы не используете рельсы, попробуйте это
👍🏼
источник
Я думаю, что намного лучше не считать месяцы, потому что вы можете получить точный день года, используя
Time.zone.now.yday
.источник
Придумал вариант этого решения для Rails
источник
DateHelper можно использовать только для получения лет
источник
источник
источник
источник
Чтобы учесть високосные годы (и при условии наличия activesupport):
years_since
правильно изменит дату, чтобы учесть невисокосные годы (когда день рождения02-29
).источник
Вот мое решение, которое также позволяет рассчитать возраст на определенную дату:
источник
Мне тоже приходилось сталкиваться с этим, но месяцами. Стало слишком сложно. Самый простой способ, который я мог придумать, был:
Вы можете сделать то же самое с 12 месяцами:
Это будет использовать класс Date для увеличения месяца, который будет иметь дело с 28 днями, високосным годом и т. Д.
источник