2010-06-16 60 views
34

我有一種感覺有人會指出我回答這個問題的另一個問題,但我一直在尋找這個簡單問題沒有運氣。計算天差異ActiveSupport:TimeWithZone以最「紅寶石」的風格?

我有一個日期時間屬性的Activerecord。它作爲ActiveSupport:TimeWithZone返回。我知道我無法將它與DateTime.now進行比較,因爲它不包含區域,所以我需要使用Time.zone。說得通。

我想知道的是風格是否有一個「乾淨」的方式來做到這一點,而不是減去和除以86400的結果?

這是我做的:

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i 

作品,但似乎未rubyish,我覺得我失去了一些東西。我應該投射,比較還是轉換其他路線,或者這是否是在軌道中執行此操作的典型方法?欣賞任何提示或指向已經涵蓋此問題的鏈接。

謝謝

+0

你當一切都說過和做過要輸出的話嗎? – theIV 2010-06-16 00:17:01

+0

我僅限於在momemnt的模型中進行此操作,所以我無法利用time_ago_in_words助手。我只是把int值帶回客戶端應用程序。感謝大家的反饋。 – Nick 2010-06-16 17:29:17

回答

73

有一兩件事可以做,以使其更具可讀性是:

((Time.zone.now - myActiveRecord.visit_date)/1.day).to_i 

編輯:

其實你可以擺脫一組用括號中:

(Time.zone.now - myActiveRecord.visit_date).to_i/1.day 
+0

實際上有一種方法可以在下面提到。 – jamesconant 2015-01-12 16:30:00

+0

''(Time.zone.now - 3.days.ago).to_i/1.day''會輸出''2'' – dgilperez 2015-02-19 03:24:34

+1

這並不總是奏效。我不得不這樣做:'(myActiveRecord.end_date.to_datetime.to_i - Time.now.to_i)/ 1.day' – 2015-03-23 19:15:27

14

我知道這個問題有點過時,但我碰到它,而谷歌搜索類似問題。就我而言,我需要從宏觀和微觀的角度來了解整天的差異。

例如,我需要我的代碼才能告訴我,2010年12月31日是2012年1月1日前的366天,而2010年12月31日23:59是1天后從2011年1月1日00: 00。上面的方法適用於前者,但在後者的情況下,它表示它們相隔0天。

我最終做的是使用Ruby的Date類來爲我做數學。使用上面我的方法的代碼如下所示:

(Time.zone.now.to_date - myActiveRecord.visit_date.to_date).to_i

這將在TimeDateTime與投入工作,由於轉換。另一個可能的解決方案是首先撥beginning_of_dayTimesDateTimes的每一個,但在我的情況下,分鐘是重要的。

-1

Rails實際上有一種內置於此類事物的方法。

結賬#time_ago_in_words

所以,原來如此......

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i

VS

time_ago_in_words(myActiveRecord.visit_date)

+0

實際上,該方法返回一個人類可讀的字符串描述,而不是實際的數字差異。 – 2015-01-13 14:45:53

+0

哎呀,很好。 – jamesconant 2015-01-14 14:53:09