Как вычислить, сколько годы передали начиная с данной даты в Ruby?

Этот вопрос был здесь для других языков, таким образом позвольте здесь быть один для Ruby.

Как я вычисляю число полных лет, которые передали с данной даты? Как Вы, вероятно, предположили, это должно вычислить возраст человека автоматически. Самый близкий distance_of_time_in_words Помощник направляющих, таким образом, следующий шаблон

Jack is <%= distance_of_time_in_words (Time.now, Time.local(1950,03,22)) %> old.

урожаи

Jack is over 59 years old.

Но мне нужна более точная функция, которая приводит просто к числу. Есть ли один?

Если бы там существует некоторая функция помощника Ruby on Rails для этого, это в порядке, хотя чистое решение Ruby было бы лучше.

Править: суть вопроса - то, что неприближенное решение необходимо. 2-го марта Jack должно быть 59 лет, и на следующий день ему должно быть 60 лет. Високосные годы и такой должны быть приняты во внимание.

20
задан P Shved 14 December 2009 в 23:49
поделиться

7 ответов

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

def age_in_completed_years (bd, d)
    # Difference in years, less one if you have not had a birthday this year.
    a = d.year - bd.year
    a = a - 1 if (
         bd.month >  d.month or 
        (bd.month >= d.month and bd.day > d.day)
    )
    a
end

birthdate = Date.new(2000, 12, 15)
today     = Date.new(2009, 12, 14)

puts age_in_completed_years(birthdate, today)
39
ответ дан 29 November 2019 в 22:44
поделиться
require 'date'

def years_since(dt)
    delta = (Date.today - Date.parse(dt)) / 365
    delta.to_i
end
6
ответ дан 29 November 2019 в 22:44
поделиться

Как насчет чего-то вроде:

def years_diff(from_time,to_time)
  (((to_time - from_time).abs)/ (365 * 24 * 60 * 60)).to_i
end

years_diff(Time.now,Time.local(1950,03,22)) #=> 59
years_diff(Time.now,Time.local(2009,03,22)) #=> 0
years_diff(Time.now,Time.local(2008,03,22)) #=> 1
0
ответ дан 29 November 2019 в 22:44
поделиться

Та же идея, что и FM, но с упрощенным оператором if. Очевидно, вы можете добавить второй аргумент вместо текущего времени.

def age(birthdate)
  now = DateTime.now
  age = now.year - birthdate.year
  age -= 1 if(now.yday < birthdate.yday)
  age
end
2
ответ дан 29 November 2019 в 22:44
поделиться

У меня есть гем / плагин под названием dotiw , у которого есть distance_of_time_in_words_hash , который возвращает хеш вида: {: years => 59 ,: месяцев => 11,: дней => 27} . Исходя из этого, вы можете определить, приближается ли он к определенному пределу.

5
ответ дан 29 November 2019 в 22:44
поделиться

Вы поймали неправильное исключение.

-121--3456779-

Вы пытаетесь перехватить исключение NumberFormatException. Необходимо добавить инструкцию catch для ScannerException, поскольку она отличается от NumberFormatException.

-121--3456777-

Я думаю, что это всегда будет работать, даже для кого-то с днем рождения около високосного дня:

require 'date'

def calculate_age(start_date, end_date)
  end_date.year - start_date.year - ((end_date.month > start_date.month || (end_date.month == start_date.month && end_date.day >= start_date.day)) ? 0 : 1)
end

puts calculate_age( Date.strptime('03/02/1968', '%m/%d/%Y'), Date.strptime('03/02/2010', '%m/%d/%Y'))

Расчетный возраст с помощью этого метода в приведенном выше примере звонка составляет 42 года, что правильно, несмотря на то, что 1968 год был високосным годом, а день рождения был близок к високосному дню.

Кроме того, в этом пути нет необходимости создавать локальную переменную.

1
ответ дан 29 November 2019 в 22:44
поделиться

withing http://github.com/radar/dotiw

Jack is <%= distance_of_time_in_words (Time.now, Time.local(1950,03,22)) %> old.

produce

Jack is 60 years old
2
ответ дан 29 November 2019 в 22:44
поделиться
Другие вопросы по тегам:

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