使用Ruby计算日期之差

19

我只是在学习 Ruby 并且正在玩日期/时间相关的东西。

irb(main):001:0> jamis_DOB = Time.mktime(2003, 10, 22, 06, 59)
=> Wed Oct 22 06:59:00 +0300 2003
irb(main):002:0> age = Time.now - jamis_DOB
=> 222934108.172989
irb(main):005:0> age_in_years = (((age / 3600) / 24) / 365).to_i
=> 7

我的例子不是很好,因为年龄age_in_years不知道是否有闰年的影响。我查看了一些谷歌上的时间/日期教程,并没有找到一个简单的方法来减去两个日期并返回以年、月、日等格式。我猜想Ruby可能有一个附加组件或内置功能可以做到这种事情。能否告诉我是什么?(另外,任何关于如何在将来参考中找到此类答案的建议?)

感谢。

1个回答

37

您需要使用Date而不是Time

require 'date'

now = Date.today
before = Date.civil(2000, 1, 1)
difference_in_days = (now - before).to_i

(difference_in_days/365.25).to_i

以下代码将返回今天和2000年1月1日之间的年份差异。它的精度可以得到改进,目前使用了每年平均天数(365.25),这会给出正确的答案,但在极端情况下可能不准确。

你也可以尝试这样做:

require 'date'

years = 0
d = Date.civil(2000, 1, 1)
loop do
  d = d.next_year
  break if Date.today < d
  years += 1
end

但是 Date#next_year 是在 Ruby 1.9 中引入的,所以它在 1.8.7 中不起作用。

当然,确定两个日期之间的年数最简单的方法就是相减:

2010 - 2000 # => 10

谢谢Theo :)你的第三个建议启发了我去做...require 'date'date_now = Date.today dob = Date.civil(2003, 10, 22) if date_now.month > dob.month age = date_now.year - dob.year elsif date_now.month == dob.month && date_now.day > dob.day age = date_now.year - dob.yearelse age = (date_now.year - dob.year) - 1 endendprint "正确的年龄是:", age, "\n"我还不能理解你的第二个建议,也无法运行1.9来尝试它。 - Leke
是的,你说得对,最后一个例子当然也要考虑月份和日期。中间的例子只是在循环中每次增加一年并计算循环次数。我已经修改了它,使其更加正确。 - Theo
3
我对Ruby为什么在日期减法后总是返回/1感到相当困惑,如上所述,重要的是对结果进行to_i操作,以便将其作为天数值获取。 - waffl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接