2012-11-10 191 views
1

我有兩個日期:start dateend date。我想計算end datestart date之間的天數。如果start date1-11-2011,end date2-11-2012,並且我放了start date - end date,它將顯示天數爲1,並且不會計算月和年。我怎樣才能做到這一點在紅寶石?請幫助我。日期之間的天數

+0

你不能有一個名爲'變量開始date'或'結束日期'。你真的有'start_date'嗎? – sawa

回答

4
require 'date' 

start_date = Date.parse('1-11-2011') 
# => #<Date: 2011-11-01 … > 
end_date = Date.parse('2-11-2012') 
# => #<Date: 2012-11-02 … > 

inclusive_days_in_range = (start_date .. end_date).count 
# => 368 

或者,如果你關心效率(兩個數量級更快):

inclusive_days_in_range = (end_date - start_date) + 1 
# => 368 

請注意,如果您使用Date.parse,給定日期字符串像你將被解釋爲,如果它從一天開始,然後是月和年。如果這不是你想要的,你必須使用Date.strptime方法手動指定你的日期格式,即使我不知道地球上的任何國家,這將是傳統的日期格式。需要明確的是,避免串解析,你也可以初始化日期對象的方式如下:

Date.new(2012, 1, 11) 

另一個好主意是使用ISO-8601(YYYY-MM-DD)格式在應用程序內部,只有把它們轉換成本地化根據需要提交的表述以提高清晰度。

+2

不會做'(start_date ... end_date).count',這會初始化大量的Date對象。做'end_date - start_date'而不是 – levinalex

+1

是的,如果效率是相關的,你應該這樣做。但是,你必須意識到,有一天範圍內不計算在內。你將不得不添加'result + 1'。 – aef

5
require "date" 
(
    Date.strptime("2-11-2012", "%m-%d-%Y") - 
    Date.strptime("1-11-2011", "%m-%d-%Y") 
).to_i + 1 
# => 397 
+1

正如我在對我自己的回答的評論中所說的那樣,當減去日期時,你不會得到所有日子的數量,就好像你有一個包容性範圍但少一個。 – aef

+0

@aef對。我錯過了這個部分的答案。我糾正了它。謝謝。 – sawa

0

試試這個。

time_ago_in_words(pending_requests.created_at) 

這將需要數天數和小時都 例如像照顧

about 17 hours ago 

3 days ago