Количество дней между двумя экземплярами времени - PullRequest
22 голосов
/ 07 марта 2012

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

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

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

Ответы [ 7 ]

42 голосов
/ 07 марта 2012

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

(t1 - t2).to_i / (24 * 60 * 60)
16 голосов
/ 07 марта 2012
require 'date'
days_between = (Date.parse(laterTime.to_s) - Date.parse(earlyTime.to_s)).round

Редактировать ... или проще ...

require 'date'
(laterTime.to_date - earlyTime.to_date).round
7 голосов
/ 07 марта 2012
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 голосов
/ 30 октября 2013

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

num = 0
cur = start_time
while cur < end_time
  num += 1
  cur = cur.advance(:days => 1)
end
return num
3 голосов
/ 10 мая 2016

Вот простой ответ, который работает через летнее время:

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

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

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

3 голосов
/ 15 апреля 2014
[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
1 голос
/ 27 октября 2015

Ни один из этих ответов на самом деле не сработает, если вы не хотите оценивать и хотите учесть летнее время. Например, в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...