2013-07-16 2 views
3

Я хочу получить точное время в днях и часах между двумя датами примерно между Thu Jul 18 11:30:00 +0000 2013 и Sat Jul 20 10:30:00 +0000 2013. Существует разница 1 day and 23 hours. Модуль ActionView Rails включает два метода:Точная разница между двумя датами в днях и часах

(1) distance_of_time_in_words 
(2) distance_of_time_in_words_to_now 

, но они возвращают результат, как 1 день или 2 дня, мне также нужны часы.

ответ

4

Для этого есть драгоценный камень: time_diff!

https://rubygems.org/gems/time_diff

Он будет отображать разницу во времени, и вы можете даже формат вывода. Пример:

'%y, %M, %w, %d and %h:%m:%s' вернется: '1 year, 2 months, 3 weeks, 4 days and 12:05:52'

Синтаксис также очень straighforward:

> Time.diff(Time.parse('2010-03-06 12:30:00'), Time.parse('2011-03-07 12:30:30'), '%y, %d and %h:%m:%s') 
=> {:year => 1, :month => 0, :week => 0, :day => 0, :hour => 18, :minute => 0, :second => 30, :diff => '1 year and 18:00:30'} 

Вы должны быть в состоянии получить то, что вам нужно из-за этого.

Счастливое кодирование!

+1

Я столкнулся проблемы совместимости в жемчужину «time_diff» , Однако он успешно установил проблему совместимости, я использую Rails 2.3.2 и ruby ​​ruby ​​1.8.7. Можете ли вы помочь Относитесь к этому – sumit

+1

Кажется, что time_diff использует 'ActiveSupport v3.0.1', который был выпущен 14 октября 2010 года (см.' Gemfile.lock'), когда версия Rails, которую вы используете, была выпущена до этого: 2.3.2 March 15, 2009. Там, вероятно, есть некоторая несовместимость. Итак, есть два решения: обновить Rails или сам камень, я думаю. Версия Ruby не представляет проблемы (она используется самим камнем). И, как раз для вашей информации, знайте, что 1.8.7 больше не поддерживается: http://www.ruby-lang.org/en/news/2011/10/06/plans-for-1-8-7/. Надеюсь это поможет ! – achedeuzot

+0

Спасибо за объяснение .. – sumit

6

Возможно, для решения этой проблемы может понадобиться плагин dotiw.

dotiw - это плагин для Rails, который переопределяет значение по умолчанию distance_of_time_in_words и обеспечивает более точный вывод.

+1

yep Я использовал dotiw, но похоже, что это влияет на другие части моего проекта, поэтому мне нужно некоторое альтернативное решение, чем dotiw. Но спасибо за решение .. – sumit

+0

@sumit Если конфликт заключается в том, что dotiw изменяет выходные данные distance_of_time_in_words, тогда можно использовать неопределенный вариант, чтобы использовать исходный формат, но distance_of_time_in_words_hash все еще доступен. – mindriot

1
date_1 = DateTime.parse("Thu Jul 18 11:30:00 +0000 2013") 
date_2 = DateTime.parse("Sat Jul 20 10:30:00 +0000 2013") 

difference_in_hours = (date_2.to_time - date_1.to_time)/60/60 
+1

Это решение может быть полезным для меня, но это дает мне неправильное количество часов между двумя датами, например между «Thu, 18 Jul 2013 11:30:00 +0000» и «Wed Jul 17 06:31:44 +0000 2013» Возврат «-72.42713155» Можете ли вы объяснить, как может быть 72-часовая разница между двумя последовательными датами? Или, пожалуйста, дайте подсказки, как я могу заставить ее работать правильно. – sumit

+1

Следуя приведенному выше коду, необходимо вернуть ровно '47'. Что именно вы используете для получения '-72.42713155'? Кроме того, я обновил свой ответ выше. – Trip

+1

приведенный выше пример дает 47, вы правы. Но если вы принимаете разницу между двумя датами, которые имеют большую разницу, чем то, что она дает ложное количество часов ... Ну, Thnaks за вашу поддержку ... – sumit

7

Если вы не хотите использовать любой драгоценный камень, то вы можете просто сделать следующие расчеты, чтобы получить точную разницу в минутах и ​​секундах тоже -

t1 = Time.now #date1 
t2 = (Time.now - 10.hours) #date2 

seconds = (t1.to_i - t2.to_i) 
days = seconds/86400; 
hours = seconds/3600; 
minutes = (seconds - (hours * 3600))/60; 
seconds = (seconds - (hours * 3600) - (minutes * 60)); 
Смежные вопросы