2010-11-14 25 views
13

我只是看看紅寶石,正在玩日期/時間的事情。與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不知道年份加起來是否有閏年。 我已經通過一些Google時間/日期教程,並沒有找到一個簡單的方法來減去兩個日期,並讓它在幾年,幾個月,幾天等格式返回。 我猜想ruby有一個附加組件或內置的這種東西。有人能告訴我它是什麼嗎? (另外,有什麼建議如何找到這種類型的東西的答案以供將來參考?)

謝謝。

回答

29

你想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 

會給你今天和1月1日2000年之間的差別大概可以提高,我只是用每年的天數的平均數(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 
+0

感謝西奧:) 你的第三個建議,激發了我做的...... 需要'日期」 date_now = Date.today DOB = Date.civil(2003,10,22) 如果date_now.month> dob.month 年齡= date_now.year - dob.year ELSIF date_now.month == DOB .month && date_now.day> dob.day 年齡= date_now.year - dob.year 否則 年齡=(date_now.year - dob.year) - 1點 結束 結束 打印 「正確的年齡:」 年齡, 「\ n」 我無法真正理解你的第二個建議,並且似乎無法運行1.9來玩它。 – Leke 2010-11-14 12:20:25

+0

是的,你說得對,當然,最後一個例子也需要考慮每月和每一天。中間示例在循環中每轉一步就會步行一年,然後計算輪次。我改變了它更正確一點。 – Theo 2010-11-14 14:45:07

+2

對於爲什麼Ruby總是在我的日期減法之後返回'/ 1',我感到非常困惑,對於如上所述的結果執行'to_i'很重要,以便將該值作爲天數來獲取。 – waffl 2014-08-14 16:25:09