2009-12-20 69 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中

相关问题