2つの日付間の日数を数える


149

これら2つの日付の間の日数を数えるにはどうすればよいですか?

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

回答:


207

Date(およびDateTime)クラスを使用する(end_date - start_date).to_iと、日数の差を取得できます。


5
@MichaelDurrantあなたは不当な仮定をしています。ユーザーはそれらが文字列かどうかを指定しません。実際、Railsを使用しているので、日付はActiveRecordからのものである可能性が高く、自動的に日付オブジェクトにキャストされます。指定されたテキストもDateオブジェクトの表現と同じであるため、ネイティブソースからのものである可能性が高くなります。
アンドリューフランス

84
それは、NOT V3 / 4レールに日でくれ秒差を与える
2calledカオス

6
RubyとActiveSupportの最近のすべてのバージョンで動作が変わらないことがわかる限り、それぞれ2.0と4.1.0を含めます。Timeただし、オブジェクトは秒を返します。
アンドリューフランス

5
@ 2called-chaosの回答を拡張して、必要な日数を取得するには(end_date-start_date)/1.dayで、フロートが得られます。丸1日だけ過ごしたい場合は、((end_date-start_date)/1.day).ceil
David K.

2
@David @ 2called-chaosによるコメントが、TimeオブジェクトではなくDateオブジェクトを誤って参照している場合を除きます。コメントの名前を更新して、日付ではないことを反映できますか?
Andrew France

109

それがRails のクラスの両方であるend_dateとすると、次のように使用できます。start_dateActiveSupport::TimeWithZone

(end_date.to_date - start_date.to_date).to_i

2
テーブルのフィールドに関係する場合、この答えが道です。ここで最も評価の高いものの代わりに。
ベン

以下のために動作しません(Time.zone.now.to_date - 23.hours.ago.to_date).to_i、それは1を与え、0である必要があり、
ユーリGhensevを

3
@YuriGhensev。これは、サンプルコードをいつ実行するかによって異なります。たとえば、現在Time.zone.now.to_date「2017年11月15日水曜日」を23.hours.ago.to_date返し、「2017年11月14日火曜日」を返します。日数の違いは、午前0時の前の時間にコードを実行しない限り、1であるはずです。
lee

35

Railsには、これを解決するヘルパーがいくつか組み込まれています。注意すべき点の1つは、これは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"

@MaayanNavehそれはあなたが計算のために実際の数が必要なときではありません。
Fedcomp、

この質問は、質問自体が別の方法で尋ねられる方がよいケースの1つです。ここで他の回答に従うと、日ではなく週または年が表示される場合があります。これは本当に「正しい」Railsの回答として受け入れられるべきです。
Dylan Pierce

34

私は結果を数秒で取得し続けたので、これは私にとってうまくいきました:

(Time.now - self.created_at) / 86400

1
@Epigene 1.dayruby、OPで要求されたものとは異なります(タグ内)。それはだRailsか、より具体的なactive supportもののcreated_at、基本的にはModel中の方法Rails..だから
ロコ

26

時間範囲内の日数を取得する(すべての日数のみ)

(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

この@ a14mをありがとう!包括的で排他的な日付のキャプチャを行う方法を私に与えた:)
Kris Boyd

18

(この日付に対する)以前の回答のいずれも、2つの日付間の日数の正確な違いを示していません。

最も近いものは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遷移を越えて進むと、期待どおりに動作しない可能性があります。この場合、DSTの移行日の長さは合法的に24時間未満ですが、整数演算のため、その日はまったく反映されません。
PinnyM

4

2つの日付(DateTimeオブジェクト)間の日数を取得するには:

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

ユーリの答えと同じ夏時間の問題。時間のある算術は、あなたが期待するほど簡単ではありません:)
PinnyM

0

2つの日付による日数の差を取得するには:

(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は、営業日の調整について尋ねたことはありません。とにかくこれは本当に複雑です。
ネイサン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.