2012-03-05 120 views

回答

161

日期(和DateTime)班,你可以做(end_date - start_date).to_i獲得天差數。

+0

是的,但用戶有字符串,你不能用字符串做到這一點。你需要他們作爲日期。看看我的答案是從核心擴展中添加to_date。 – 2012-03-05 19:59:27

+5

@MichaelDurrant你正在做一個毫無根據的假設。用戶不指定它們是否是字符串。事實上,因爲他們使用Rails,所以最有可能的日期來自ActiveRecord,它會自動將它們轉換爲日期對象。給定的文本與日期對象表示形式相同,因此極有可能它來自本機源。 – 2012-03-05 20:04:15

+1

正確我假設用戶嘗試了一個 - B,它沒有工作,所以他們最終張貼在SO上。我猜只有andkjaer可以告訴我們真正的交易:) – 2012-03-05 20:20:06

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

更容易減去Date對象。 – holaSenor 2012-03-05 20:17:15

+0

OP從未詢問有關調整工作日的問題。無論如何,這真是令人費解。 – Nathan 2017-06-30 00:03:49

25

的Rails有內建的helpers可能解決這個給你。有一點需要記住的是,這是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" 
81

假設end_datestart_date Rails中都ActiveSupport::TimeWithZone類的,那麼你可以使用:

(end_date.to_date - start_date.to_date).to_i 
+1

如果它與表字段有關,這個答案是要走的路;而不是在這裏最受好評的一個。 – Ben 2014-04-05 21:52:43

+0

不適用於'(Time.zone.now.to_date - 23.hours.ago.to_date).to_i',它給出1並且應該爲0 – 2017-02-04 16:21:12

+0

@YuriGhensev,它取決於您何時運行示例代碼,現在示例'Time.zone.now.to_date'返回「2017年11月15日星期三」,而'23.hours.ago.to_date'返回「2017年11月14日星期二」。除非您在午夜前一小時運行代碼,否則天數的差異應爲1。 – lee 2017-11-15 20:01:32

21

我一直得到的結果在幾秒鐘內,所以這個工作對我來說:

(Time.now - self.created_at)/86400 
+4

也許'/ 1.day'更具可讀性。 – Epigene 2016-12-02 15:29:41

+0

@Epigene'1.day'不是OP請求的'ruby'(在標籤中)。它是'Rails'或者更具體的'active support',雖然'created_at'基本上是'Rails'中的'Model'方法。 – Roko 2017-09-04 12:03:03

3

到得到時間範圍內的天數(只是所有天數)

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

拿到2個日期

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

無以前的答案(此日期)給人以天兩個日期之間的差異正確之間的天數。

最接近的那個是thatdankent。一個完整的答案將轉換to_i然後劃分:

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

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

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

在問題的具體的例子,一個人不應該對分析,如果Date經過的時間是相關的。改爲使用Time.parse

0

要讓全日兩個日期(DateTime對象)之間的數字: