Ruby 计算两个日期之间的天数

Ruby 计算两个日期之间的天数,ruby,Ruby,如何计算这两个日期之间的天数 start_date = Date.parse "2012-03-02 14:46:21 +0100" end_date = Date.parse "2012-04-02 14:46:21 +0200" Rails有一些内置功能,可以为您解决这个问题。需要记住的一点是,这是Actionview帮助程序的一部分,因此它们不能直接从控制台获得 试试这个 <% start_time = "2012-03-02 14:46:21 +0100" %> <

如何计算这两个日期之间的天数

start_date = Date.parse "2012-03-02 14:46:21 +0100"
end_date =  Date.parse "2012-04-02 14:46:21 +0200"
Rails有一些内置功能,可以为您解决这个问题。需要记住的一点是,这是Actionview帮助程序的一部分,因此它们不能直接从控制台获得

试试这个

<% start_time =  "2012-03-02 14:46:21 +0100" %>
<% end_time   =  "2012-04-02 14:46:21 +0200" %>
<%= distance_of_time_in_words(start_time, end_time)  %>

 "about 1 month"

“大约1个月”

使用日期(和日期时间)类,您可以执行
(结束日期-开始日期)。to\u i
获取天数差异。

假设
结束日期
开始日期
都是Rails中的类
ActiveSupport::TimeWithZone
,那么您可以使用:

(end_date.to_date - start_date.to_date).to_i

我总是在几秒钟内得到结果,所以这对我来说很有效:

(Time.now - self.created_at) / 86400

获取时间范围内的天数(仅计算所有天数)

获取两个日期之间的天数

(start_date...end_date).count
(start_date...end_date).to_a.size
#=> 31

之前的答案(到目前为止)都没有给出两个日期之间天数的正确差异

最接近的是通过。完整答案将
转换为_i
,然后除以:

(Time.now.to_i - 23.hours.ago.to_i) / 86400
>> 0

(Time.now.to_i - 25.hours.ago.to_i) / 86400
>> 1

(Time.now.to_i - 1.day.ago.to_i) / 86400
>> 1

在问题的具体示例中,如果经过的时间相关,则不应解析为
Date
。改用
Time.parse

获取两个日期之间的天数(
DateTime
对象):


要获取两个日期的天数差,请执行以下操作:

(start.to_date...end.to_date).count - 1
or 
(end.to_date - start.to_date).to_i

任何人都有最佳实践,请稍后在下面发表评论,但它可能会帮助其他人:

end_date.mjd - start_date.mjd

@Michaeldurrent你在做一个毫无根据的假设。用户不指定它们是否为字符串。事实上,因为他们使用的是Rails,所以日期很可能来自ActiveRecord,ActiveRecord会自动将它们转换为日期对象。给定的文本也与日期对象表示形式相同,这使得它很可能来自本机源代码。这使我在rails v3/4中的差异以秒为单位,而不是以天为单位。据我所知,在Ruby和ActiveSupport的所有最新版本中,行为都保持不变,分别包括2.0和4.1.0<代码>时间对象确实返回秒。若要在@2调用的混沌答案上展开,请获得您需要的天数(结束日期-开始日期)/1.day,这将给您一个浮动。如果您只想拥有完整的天数,您可以使用((结束日期-开始日期)/1.day)。ceil@David除了@2called chaos的注释错误地指的是
Time
对象,而不是
Date
对象。也许你可以更新评论中的命名,以反映它们不是日期?减去日期对象要容易得多。OP从未询问过调整工作日。不管怎么说,这真的很复杂。如果这与表字段有关,那么这个答案就是正确的;而不是这里评级最高的。不适用于
(Time.zone.now.to_date-23.hours.ago.to_date)。to_i
,它给出1,应该是0@YuriGhensev,这取决于您运行示例代码的时间,例如现在
Time.zone.now.to_date
返回“Wed,Nov 2017年11月15日”,而
23.hours.ago.to_date
返回“2017年11月14日,星期二”。除非您在午夜前一小时运行代码,否则天数的差值为且应该为1。@Epigene
1。day
不是OP要求的
ruby
(在标记中)它是
Rails
或更具体的
主动支持
,虽然
Rails
中创建的
基本上是一种
模型
方法,所以..感谢@a14m!给了我一种方法来进行包容性和排他性的日期捕获:)@MaayanNaveh它不应该在您需要实际数字进行计算时出现。这个问题是其中一种情况下,问题本身最好以不同的方式提问。如果你按照其他答案回答,你会遇到这样的情况,有时你希望显示几周或几年而不是几天。这确实应该被认为是“正确的”“Rails回答。当时间跨越DST转换前进时,这可能不会像预期的那样起作用。在这种情况下,DST过渡日长度合法地小于24小时,但由于整数运算,该日将根本不会反映出来。与Yuri给出的答案相同的DST问题。计算时间永远不会像你想象的那样简单:)
((end_at - start_at).to_f / 1.day).floor
(start.to_date...end.to_date).count - 1
or 
(end.to_date - start.to_date).to_i
(end_date - start_date)/1000/60/60/24
end_date.mjd - start_date.mjd