web-dev-qa-db-ja.com

2つのTimeインスタンス間の日数

Rubyで2つのTimeインスタンス間の日数を確認するにはどうすればよいですか?

> earlyTime = Time.at(123)
> laterTime = Time.now
> time_difference = laterTime - earlyTime

time_differenceの日数を確認したい(日数の端数は気にしない。切り上げまたは切り下げで問題ない)。

23
SundayMonday

2回の差は秒単位です。 24時間の秒数で割ります。

(t1 - t2).to_i / (24 * 60 * 60)
43
require 'date'
days_between = (Date.parse(laterTime.to_s) - Date.parse(earlyTime.to_s)).round

編集 ...またはもっと簡単に...

require 'date'
(laterTime.to_date - earlyTime.to_date).round
16
Phrogz
earlyTime = Time.at(123)
laterTime = Time.now
time_difference = laterTime - earlyTime
time_difference_in_days = time_difference / 1.day  # just divide by 1.day
7
James Brooks
[1] pry(main)> earlyTime = Time.at(123)
=> 1970-01-01 01:02:03 +0100
[2] pry(main)> laterTime = Time.now
=> 2014-04-15 11:13:40 +0200
[3] pry(main)> (laterTime.to_date - earlyTime.to_date).to_i
=> 16175
4
Kamil Lelonek

DST(夏時間)を考慮するには、日数でカウントする必要があります。これは、1日未満が1(切り上げ)としてカウントされることを前提としていることに注意してください。

num = 0
cur = start_time
while cur < end_time
  num += 1
  cur = cur.advance(:days => 1)
end
return num
4
ambivalence

DST全体で機能する簡単な回答は次のとおりです。

numDays = ((laterTime - earlyTime)/(24.0*60*60)).round

60 * 60は1時間の秒数です。24.0は1日の時間数です。 24時間強の日もあれば、それより短い日もあるので、フロートです。したがって、1日の秒数で割ると、まだ浮動小数点数があり、roundは最も近い整数に丸められます。

したがって、いずれにせよ、DSTを通過する場合でも、最も近い日に丸められます。 DSTで1時間以上変化する奇妙なタイムゾーンにいる場合でも。

見積もりをしたくなく、夏時間を考慮したい場合、これらの答えは実際には機能しません。たとえば、時計の秋の変更前の水曜日の午前10時と、その後の水曜日の午前10時の場合、それらの間の時間は1週間と1時間になります。春の間は1週間マイナス1時間になります。正確な時刻を取得するには、次のコードを使用できます

def self.days_between_two_dates later_time, early_time
   days_between = (later_time.to_date-early_time.to_date).to_f
   later_time_time_of_day_in_seconds = later_time.hour*3600+later_time.min*60+later_time.sec
   earlier_time_time_of_day_in_seconds = early_time.hour*3600+early_time.min*60+early_time.sec
   days_between + (later_time_time_of_day_in_seconds - early_time_time_of_day_in_seconds)/1.0.day   
end
2
stevo999999