Подтвердить что ты не робот

Количество дней между двумя экземплярами времени

Как определить количество дней между двумя экземплярами Time в Ruby?

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

Я хотел бы определить количество дней в time_difference (меня не беспокоят доли дней. Округление вверх или вниз в порядке).

4b9b3361

Ответ 1

Разница двух раз в секундах. Разделите его на количество секунд в течение 24 часов.

(t1 - t2).to_i / (24 * 60 * 60)

Ответ 2

require 'date'
days_between = (Date.parse(laterTime.to_s) - Date.parse(earlyTime.to_s)).round

Изменить... или проще...

require 'date'
(laterTime.to_date - earlyTime.to_date).round

Ответ 3

earlyTime = Time.at(123)
laterTime = Time.now
time_difference = laterTime - earlyTime
time_difference_in_days = time_difference / 1.day  # just divide by 1.day

Ответ 4

Чтобы учесть DST (переход на летнее время), вам придется учитывать его по дням. Обратите внимание, что это предполагает, что менее одного дня считается 1 (округленное):

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

Ответ 5

[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

Ответ 6

Вот простой ответ, который работает через DST:

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

60 * 60 - это количество секунд в час 24.0 - это количество часов в день. Это поплавок, потому что некоторые дни немного больше, чем на 24 часа, а некоторые меньше. Поэтому, когда мы делимся на количество секунд в сутки, у нас все еще есть float, а round округляется до ближайшего целого числа.

Итак, если мы перейдем к DST, в любом случае, мы все равно продолжим свой ближайший день. Даже если вы находитесь в каком-то странном часовом поясе, который меняет больше часа на летнее время.

Ответ 7

Ни один из этих ответов не будет работать, если вы не хотите оценивать, и вы хотите учесть переход на летнее время. Например, 10 часов утра в среду перед падением смены часов и 10:00 в среду после этого, время между ними будет 1 неделя и 1 час. Во время spring это будет 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