2009-12-20 32 views
28

Time.zone.now.to_date相當於Date.todayTime.zone.now.to_date是否等同於Date.today?

另一種說法:Time.zone.now.to_date == Date.today總會是true

如果不是,在應用程序時區中獲取與「now」對應的Date對象的最佳方式是什麼?

+0

這是日期和時間,以避免時區陷阱有很大的參考:HTTP: //danilenko.org/2012/7/6/rails_timezones/ – Matt 2013-01-09 21:39:59

+0

正確的方法是這樣的:http://stackoverflow.com/a/27397193/115363 – 2016-03-25 15:34:48

回答

39

它們並不總是相同的。 Time.zone.now.to_date將使用應用程序時區,而Date.today將使用服務器時區。所以,如果兩人躺在不同的日期,那麼他們會有所不同。從我的控制檯一個例子:

ruby-1.9.2-p290 :036 > Time.zone = "Sydney" 
=> "Sydney" 
ruby-1.9.2-p290 :037 > Time.zone.now.to_date 
=> Wed, 21 Sep 2011 
ruby-1.9.2-p290 :038 > Date.today 
=> Tue, 20 Sep 2011 
+0

請注意這個問題:http://stackoverflow.com/a/27397193/115363 – 2016-03-25 15:34:43

9

即使簡單:Time.zone.today

我也寫了一個小的輔助方法Date.today_in_zone,使得它很容易得到一個「今天」 Date特定時間段,而不必變化Time.zone

# Defaults to using Time.zone 
> Date.today_in_zone 
=> Fri, 26 Oct 2012 

# Or specify a zone to use 
> Date.today_in_zone('Sydney') 
=> Sat, 27 Oct 2012 

要使用它,只是拋出此文件中的像'lib/date_extensions.rb'require 'date_extensions'

class Date 
    def self.today_in_zone(zone = ::Time.zone) 
    ::Time.find_zone!(zone).today 
    end 
end 
2

我認爲最好的辦法就是通過學習當前時間:

Time.current 

這會自動檢查是否已設置時區,然後它會調用Time.zone.now,但如果你沒有它只會調用Time.now。

此外,不要忘記設置時區在application.rb中

相關問題