Вопрос по time, ruby-on-rails, ruby – Рубин: Рассчитать разницу во времени между 2 раза

0

Я хочу рассчитать разницу между 2 раза. start_time: 22:00 (Rails интерпретирует это как 2015-12-31 22:00:00 +0100) second_time: 02:00 (Rails интерпретирует это как 2015-12-31 02:00:00 +0100). Второй раз спустя 4 часа, поэтому на следующий день. Есть ли способ рассчитать эту разницу?

Я не могу просто сделать это: second_time - first_time, потому что это дает мне разницу в 22 часа вместо 4 часов.

Редактировать:Некоторая справочная информация: Работа начинается в 22:00 и заканчивается на следующий день в 02:00. Поскольку я заполняю форму этой работы только один раз, это время для двух вышеуказанных значений: 2015-12-31 22:00:00 +0100 и 2015-12-31 02:00:00 +0100. Я не хочу, чтобы пользователь указывал время, включая дату. Реальная разница между временем должна составлять 4 часа.

Так что я на самом деле хочу вычислить разницу между 22:00 и 02:00 (на следующий день).

Как может2015-12-31 02:00:00 +0100 быть в течение дня после2015-12-31 22:00:00 +0100? Это одни и те же дни. sawa

Ваш Ответ

1   ответ
8

Я не понимаю, почему вы думаете, что он должен вернуться через 4 часа или почему он возвращается через 22 часа. 20 часов будет правильным для вашего примера:

require 'time'

a = Time.parse('2015-12-31 22:00:00 +0100')
b = Time.parse('2015-12-31 02:00:00 +0100')

a - b
#=> 72000.0 # difference in seconds

(a - b) / 3600
#=> 20.0  # difference in hours

ОбновитьПохоже, вы имеете дело только с частью времени, а не с фактической датой. И я предполагаю, что максимальная разница, с которой вам придется иметь дело, составляет 24 часа:

def time_difference(time_a, time_b)
  difference = time_b - time_a

  if difference > 0
    difference
  else
    24 * 3600 + difference 
  end
end

a = Time.parse('2015-12-31 22:00:00 +0100')
b = Time.parse('2015-12-31 02:00:00 +0100')
time_difference(a, b) / 3600
# => 4 # hours

a = Time.parse('2015-12-31 02:00:00 +0100')
b = Time.parse('2015-12-31 22:00:00 +0100')
time_difference(a, b) / 3600
# => 20 # hours
Потрясающие!!! Это именно то, что я имел в виду. Это работает для меня :) Matt Dice
@MattDice: я обновил свой ответ. Надеюсь, я правильно понял ваши требования. spickermann
Извините, мой плохой, я добавил некоторую справочную информацию в свой пост и спасибо за ваш ответ. Matt Dice

Похожие вопросы