如何计算Ruby中给定日期过去多少年?

P S*_*ved 20 ruby datetime ruby-on-rails

这个问题是针对其他语言的,所以让我们来看看Ruby吧.

如何计算给定日期过去的完整年数?你可能已经猜到了,这是自动计算人的年龄.最接近的是distance_of_time_in_wordsRails helper,所以下面的模板

Jack is <%= distance_of_time_in_words (Time.now, Time.local(1950,03,22)) %> old.
Run Code Online (Sandbox Code Playgroud)

产量

Jack is over 59 years old.
Run Code Online (Sandbox Code Playgroud)

但我需要更精确的功能,只产生数字.有吗?

如果存在某种Ruby on Rails辅助函数,这是可以的,尽管纯Ruby解决方案会更好.

编辑:问题的要点是需要一个非近似的解决方案.在2 三月杰克的应该是59岁,第二天,他应该是60岁了.应考虑闰年等.

FMc*_*FMc 39

您是否想要年龄,因为人们通常会理解它,或者您是否正在寻找精确的时间测量?如果是前者,就没有必要担心闰年等并发症.你只需要计算几年的差异,如果这个人今年还没有过生日就减少它.如果是后者,您可以将经过的秒数转换为年,如其他答案所示.

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)
Run Code Online (Sandbox Code Playgroud)


sh-*_*eta 6

require 'date'

def years_since(dt)
    delta = (Date.today - Date.parse(dt)) / 365
    delta.to_i
end
Run Code Online (Sandbox Code Playgroud)


Rya*_*igg 5

我有一个名为dotiw的gem /插件,distance_of_time_in_words_hash它会返回一个像:{ :years => 59, :months => 11, :days => 27 }.如果它接近一定限度你可以解决.


小智 5

基于与 @FMc First 类似的推理,我想出了以下方法,计算今天的年份和生日年份之间的差异。然后,将其与生日相加并检查结果日期:如果它大于今天,则将 diff 减少 1。要在 Rails 应用程序中使用,因为它依赖于ActiveSupportyears方法

def age(birthday, today)
  diff = today.year - birthday.year
  (birthday + diff.years > today ) ? (diff - 1) : diff
end
Run Code Online (Sandbox Code Playgroud)