这个问题出现在其他语言中,所以让我们来看看Ruby吧 .
如何计算从给定日期过去的完整年份数?正如您可能已经猜到的那样,'s to calculate person'会自动衰老 . 最接近的是 distance_of_time_in_words
Rails helper,所以下面的模板
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解决方案会更好 .
Edit: the gist of the question is that a non-approximate solution is needed. At the 2nd of March Jack should be 59 years old and the next day he should be 60 years old. Leap years and such should be taken into account.
12 回答
您是否想要年龄,因为人们通常会理解它,或者您是否正在寻找精确的时间测量?如果是前者,就没有必要担心闰年等并发症 . 你只需要计算几年的差异,如果这个人今年没有过生日就减少它 . 如果是后者,您可以将经过的秒数转换为年,如其他答案所示 .
与http://github.com/radar/dotiw
生产环境
我认为这将永远有效,即使是在闰日附近有生日的人:
在上面的示例调用中使用此方法计算的年龄是42,这是正确的,尽管1968年是闰年而生日是在闰日附近 .
另外,这种方式不需要创建局部变量 .
基于与@FMc First类似的推理,我提出了以下内容,计算今天's year and birthday'年之间的差异 . 然后,将它加到生日并检查结果日期:如果它大于今天,将差异减少1.在Rails应用程序中使用,因为它依赖于
ActiveSupport
的years
方法你可以使用红宝石宝石adroit-age
它适用于闰年也..
更新
怎么样的:
处理闰年的方法
无论何时计算自某个日期起的经过年限,您都必须决定如何处理闰年 . 这是我的方法,我认为这是非常易读的,并且能够在不使用任何“特殊情况”逻辑的情况下大踏步前进 .
与FM相同的想法,但使用简化的if语句 . 显然,您可以添加第二个参数而不是使用当前时间 .
这个怎么样:
我有一个名为dotiw的gem /插件,它有一个
distance_of_time_in_words_hash
,它将返回一个像:{ :years => 59, :months => 11, :days => 27 }
这样的哈希 . 如果它接近某个限制,你可以解决这个问题 .d2.year - d1.year - (d2.month > d1.month || (d2.month == d1.month && d2.day >= d1.day) ? 0 : 1)