计算两个日期之间的天数


149

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

start_date = Date.parse "2012-03-02 14:46:21 +0100"
end_date =  Date.parse "2012-04-02 14:46:21 +0200"

Answers:


206

使用Date(和DateTime)类,您可以(end_date - start_date).to_i获取天数差异。


5
@MichaelDurrant您正在做一个毫无根据的假设。用户未指定它们是否为字符串。实际上,由于他们使用的是Rails,因此日期很可能来自ActiveRecord,它将自动将其转换为日期对象。给定的文本也与Date对象的表示形式相同,因此很有可能来自本机来源。
Andrew France

84
这给了我在几秒钟之差不与轨道V3 /4天
2called乱

6
据我所知,该行为在Ruby和ActiveSupport的所有最新版本中均保持不变,分别包括2.0和4.1.0。Time对象确实返回秒。
Andrew France

5
扩展@ 2 Called-chaos答案,以获得所需的天数(end_date-start_date)/1.day,这将使您获得浮动收益。如果您只想整天工作,则可以使用(((end_date-start_date)/1.day).ceil
David K.

2
@David除非@ 2所谓的混沌的注释错误地指向Time对象,而不是Date对象。也许您可以更新评论中的命名以反映它们不是日期?
安德鲁·法国

109

假设end_datestart_date都是ActiveSupport::TimeWithZoneRails中的类,那么您可以使用:

(end_date.to_date - start_date.to_date).to_i

2
如果它与表字段有关,那么答案就是解决方法。而不是这里评价最高的一个。
2014年

不适用于(Time.zone.now.to_date - 23.hours.ago.to_date).to_i它,它给出1且应为0
Yuri Ghensev

3
@YuriGhensev,这取决于您运行示例代码的时间,例如现在Time.zone.now.to_date返回“ Wed,15 Nov 2017”,而23.hours.ago.to_date返回“ Tue,14 Nov 2017”。除非您在午夜之前的一小时内运行代码,否则天数之差应为1。

35

Rails内置了一些帮助程序,可以为您解决这个问题。要记住的一件事是,这是Actionview Helpers的一部分,因此它们不能直接从控制台使用。

试试这个

<% 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"

@MaayanNaveh在需要实际数字进行计算时不应该使用。
Fedcomp

该问题是问题本身最好以不同方式提出的情况之一。如果您按照此处的其他答案进行操作,则会遇到有时您希望显示几周或几年而不是几天的情况。这确实应该作为Rails的“正确”答案。
迪伦·皮尔斯

34

我一直在几秒钟内获得结果,所以这对我有用:

(Time.now - self.created_at) / 86400

1
@Epigene 1.day不是rubyOP请求的(在标签中)。这Rails或多个特定active support虽然created_at基本上是一个Model在方法Rails等等..
ROKO

26

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

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

得到两个日期之间的天数

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

感谢这个@ a14m!给了我一种进行包含性和专有性日期捕获的方法:)
Kris Boyd '18

18

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

最接近的那个人是thatdankent。一个完整的答案将转换to_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代替。


当时间跨过夏令时过渡时,这可能无法按预期工作。在这种情况下,DST过渡日的长度合法地少于24小时,但是由于采用了整数运算法则,该日期根本不会得到反映。
PinnyM

4

拥有两个日期(DateTime对象)之间的整天数:

((end_at - start_at).to_f / 1.day).floor

与Yuri给出的答案相同的DST问题。时间的算术从未像您期望的那么简单:)
PinnyM

0

要获得两个日期之间的天差数:

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

-8
def business_days_between(date1, date2)
  business_days = 0
  date = date2
  while date > date1
   business_days = business_days + 1 unless date.saturday? or date.sunday?
   date = date - 1.day
  end
  business_days
end

3
减去日期对象要容易得多。
OpenCoderX 2012年

OP从未询问过要调整工作日的问题。无论如何,这确实令人费解。
内森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.