2011-04-08 24 views
26

這兩個我應該用我的Rails應用程序:DateTime.now或Time.now?

DateTime.now or Time.now 

有沒有在這兩個應用程序中使用任何危害?

在以上(now)示例的情況下,兩者之間是否會有任何差異? (在我目前的系統,他們都顯示相同的時間)

+1

的ActiveRecord和其他奧姆斯像DateTime和日期爲他們的數據庫記錄。我認爲這是因爲Date比Time有更大的範圍。時間是基於操作系統的時間概念,並且如果我記得,它與時區信息的整合更好。你可能想看看['home_run'](https://github.com/jeremyevans/home_run)作爲一個替代品,它應該快得多。 – 2011-04-08 23:22:44

回答

11

在參考Time.now(不DateTime.now):

創建的對象將使用您的系統時鐘所能達到的分辨率來創建,因此可能包括分數秒。

a = Time.new  #=> Wed Apr 09 08:56:03 CDT 2003 
b = Time.new  #=> Wed Apr 09 08:56:03 CDT 2003 
a == b   #=> false 
"%.6f" % a.to_f #=> "1049896563.230740" 
"%.6f" % b.to_f #=> "1049896563.231466" 
+0

是的,如果你不指望它們,分數秒可能看起來很糟糕,但如果你想通過轉換爲秒的整數值,或者通過使用'strftime'來格式化它們,同時保持它們爲任何時間戳數學。 – 2011-04-08 23:20:42

+1

我正在使用Rails 3,DateTime也有小數秒。這種差異只存在於Rails 2中嗎? – 2011-08-15 14:39:57

6

如果你想在應用程序的時區的時間,你就需要調用Time.zone.now,所以這就是我通常使用。

Time.nowDateTime.now都會在系統時間返回一個時間,通常設置爲UTC。

+2

按照Yarin的建議,使用(Date)[Time.current](https://github.com/rails/rails/blob/ffc273577a795bb41068bfc2a1bb575ec51a9712/activesupport/lib/active_support/core_ext/time/calculations.rb#L29)。如果Time.zone設置,Time.current將返回Time.zone.now,否則返回Time.now。 – jayeff 2014-07-29 09:48:53

29

使用(Date)Time.current代替(Date)Time.now

滑軌延伸TimeDateTime對象,並且包括current屬性檢索Rails環境被設置爲(默認= UTC)的時間,而不是在服務器時間(可能是任何事情)。

這很關鍵 - 除非在用戶輸入或顯示的時區之間進行轉換,否則應該始終以UTC時間工作,但許多生產系統默認爲而非 UTC。 (例如Heroku的設置爲PST(GMT -8))

見第here

+0

Time.now.utc也解決了它,不是嗎? – user2503775 2013-09-15 10:51:49

+1

@ user2503775 - 是的,你可以使用它,但如果出於某種原因*你確實想在非UTC時區工作(我認爲這從來不是一個好主意),至少你可以通過改變切換環境變量而不必更改代碼中的一堆值。 – Yarin 2013-09-15 12:03:40

+0

@Yarin使用Time.zone.now代替Time.current而不是Time.now – ajahongir 2013-09-17 18:11:37