2012-11-10 147 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