2013-07-16 66 views
3

我想獲得確切的時間在兩個日期之間的幾天和幾小時之間,如Thu Jul 18 11:30:00 +0000 2013Sat Jul 20 10:30:00 +0000 2013之間。有差異1 day and 23 hours。滑軌模塊的ActionView包含兩個方法確切的日期和時間的兩個日期

(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'

的語法也很簡單明瞭:

> 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和紅寶石紅寶石1.8.7。你能幫忙看看這個 – sumit

+1

看來time_diff使用了2010年10月14日發佈的'ActiveSupport v3.0.1'(見'Gemfile.lock'),當你使用的Rails版本在那之前發佈時:2.3.2 3月15,2009年。那裏可能有些不兼容。所以有兩種解決方案:更新Rails或我認爲的寶石本身。 Ruby版本沒有問題(它由gem自己使用)。而且,僅僅爲了您的信息,知道1.8.7不再支持:http://www.ruby-lang.org/zh/news/2011/10/06/plans-for-1-8-7/。希望這可以幫助 ! – achedeuzot

+0

感謝您的解釋.. – sumit

6

插件dotiw可能有助於解決此問題。

dotiw是Rails的一個插件,它覆蓋默認distance_of_time_in_words並提供更準確的輸出。

+1

是的,我已經使用dotiw,但似乎這樣影響我的項目的其他部分,所以我需要一些替代解決方案比dotiw。但感謝您的解決方案.. – sumit

+0

@sumit如果衝突是由於dotiw會改變distance_of_time_in_words的輸出,則可以添加:vague選項以使用原始格式,但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

這個解決方案對我很有用,但它給了我兩個日期之間錯誤的時間,例如「2013年7月18日星期四11:30:00 +0000」和「星期三7月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)); 
相關問題