计算两个日期之间的天数

and*_*aer 141 ruby

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

start_date = Date.parse "2012-03-02 14:46:21 +0100"
end_date =  Date.parse "2012-04-02 14:46:21 +0200"
Run Code Online (Sandbox Code Playgroud)

And*_*nce 197

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

  • 这给了我几秒钟的差异,而不是使用rails v3/4的天数 (76认同)
  • @MichaelDurrant你正在做出毫无根据的假设.用户不指定它们是否是字符串.事实上,因为他们使用Rails,所以日期最有可能来自ActiveRecord,它会自动将它们转换为日期对象.给定的文本也与Date对象表示相同,使得它很可能来自本地源. (5认同)
  • 据我所知,在所有最新版本的Ruby和ActiveSupport中,行为保持不变,分别包括2.0和4.1.0.`Time`对象确实返回秒. (5认同)
  • @David 除了@2called-chaos 的评论错误地指的是`Time` 对象,而不是`Date` 对象。也许您可以更新评论中的命名以反映它们不是日期? (4认同)
  • 扩展@2called-chaos答案,以获得你需要的日子(end_date - start_date)/1.day,这会给你一个浮动.如果你想要有完整的日子,你可以使用((end_date - start_date)/1.day).ceil (3认同)
  • `(结束日期 - 开始日期).to_i / 1.day` (3认同)

lee*_*lee 103

假设end_datestart_date都是一流的ActiveSupport::TimeWithZoneRails中,那么你可以使用:

(end_date.to_date - start_date.to_date).to_i
Run Code Online (Sandbox Code Playgroud)

  • 如果它与表字段有关,这个答案就是要走的路;而不是这里评价最高的。 (3认同)
  • @YuriGhensev,这取决于您何时运行示例代码,例如,此时“ Time.zone.now.to_date`返回“ Wed,15 Nov 2017”,而“ 23.hours.ago.to_date`返回“ Tue,14” 2017年11月”。除非您在午夜之前的一小时内运行代码,否则天数之差应为1。 (2认同)

Jus*_*ick 33

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"
Run Code Online (Sandbox Code Playgroud)


tha*_*ent 31

我在几秒钟内得到了结果,所以这对我有用:

(Time.now - self.created_at) / 86400
Run Code Online (Sandbox Code Playgroud)


a14*_*14m 23

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

(start_date..end_date).count
(start_date..end_date).to_a.size
#=> 32
Run Code Online (Sandbox Code Playgroud)

获取2个日期之间的天数

(start_date...end_date).count
(start_date...end_date).to_a.size
#=> 31
Run Code Online (Sandbox Code Playgroud)


Yur*_*sev 12

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

最接近的一个是由那个人来做.一个完整的答案会转换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
Run Code Online (Sandbox Code Playgroud)

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


小智 9

很晚了,但可能对其他人有帮助:

end_date.mjd - start_date.mjd
Run Code Online (Sandbox Code Playgroud)

https://apidock.com/ruby/Date/mjd

提示:这仅适用于日期对象,不适用于时间对象。


Dor*_*ian 6

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

((end_at - start_at).to_f / 1.day).floor
Run Code Online (Sandbox Code Playgroud)


ibr*_*mab 5

目前我所看到的始终有效的最佳解决方案是使用以下模式:

(end_date.beginning_of_day - Time.now.utc.beginning_of_day).seconds.in_days
Run Code Online (Sandbox Code Playgroud)