Вычитание даты и времени в рубине 2?

Мне нужно вычесть два DateTime объекта, чтобы узнать разницу в часах между ними.

Я стараюсь делать следующее:

a = DateTime.new(2015, 6, 20, 16)
b = DateTime.new(2015, 6, 21, 16)
puts a - b

Я получаю (-1/1), объект класса Rational.

Итак, вопрос в том, как мне узнать, в чем разница между двумя датами? Через часы или дни, или что угодно.

И что это Rational означает / представляет, когда я просто так вычитаю DateTimes?

КСТАТИ:

Когда я пытаюсь вычесть DateTime с разницей в 1 год, я получаю (366/1), поэтому, когда я делаю (366/1).to_i, я получаю количество дней. Но когда я попытался вычесть два DateTime с разницей в 1 час, это дало мне -1, количество часов. Итак, как мне также узнать значение возвращаемого значения (часы, дни, годы, секунды)?


person Denis Yakovenko    schedule 20.06.2015    source источник


Ответы (2)


Если вы вычтите две даты, вы получите разницу в днях, а не в часах.

Вы получаете тип Rational для точности (некоторые числа с плавающей запятой не могут быть точно выражены с помощью компьютеров)

Чтобы получить количество часов, умножьте результат на 24, минуты умножьте на 24 * 60 и т. Д.

a = DateTime.new(2015, 6, 20, 16)
b = DateTime.new(2015, 6, 21, 16)

(a - b).to_i 
# days
# => -1

((a - b)* 24).to_i  
# hours
# => -24
# ...

Вот ссылка на официальный документ

person jazzytomato    schedule 20.06.2015
comment
Интересно, что разница в секундах - person kev; 17.05.2021

Если вы сделаете вычитание для них как объекта Time, он вернет результат в секундах, а затем вы можете соответственно умножить, чтобы получить минуты / часы / дни / что угодно.

a = DateTime.new(2015, 6, 20, 16)
b = DateTime.new(2015, 6, 21, 16)
diff = b.to_time - a.to_time    # 86400
hours = diff / 60 / 60          # 24
person Exupery    schedule 20.06.2015