Rails 3:如何在特定的时区取得今天的date?
为了得到今天的date我做:
Date.today # => Fri, 20 May 2011
我想在特定的时区取得今天的date,比如'Melbourne'
。
我在我的application.rb
有以下设置:
config.time_zone = 'Melbourne'
我设定:
Time.zone = 'Melbourne'
在我的应用程序控制器每个动作之前
但是,这并没有帮助(我猜是因为这些设置只影响存储在数据库中的date)。
我怎么能在'Melbourne'
得到今天的date?
你应该可以这样做: Time.current
。 如果这是Time.zone
的设置,那将显示当前在墨尔本的时间。
Date
对象不一定有时区,但Time
对象。 你可以试试它作为一个Time
,然后转换回Date
:
Time.now.to_date # => Thu, 19 May 2011 Time.now.in_time_zone('Melbourne').to_date # => Fri, 20 May 2011
Date.current
可能是最清晰和简洁的方式: http : Date.current
看来Time.zone.today
也有效。
如果你想在某个指定的时区得到“今天”而不必改变Time.zone
,我会做类似fl00r和Dylan Markow的build议:
Time.now.in_time_zone('Melbourne').to_date
或这个:
Time.find_zone!('Melbourne').today
我写了一个小帮手方法Date.today_in_zone
,使得获得一个“今天” Date
更容易:
# Defaults to using Time.zone > Date.today_in_zone => Fri, 26 Oct 2012 # Or specify a zone to use > Date.today_in_zone('Melbourne') => Sat, 27 Oct 2012
我觉得它比Time.find_zone!('Melbourne').today
要使用它,只需把它放在像'lib/date_extensions.rb'
这样的文件中,并且require 'date_extensions'
。
class Date def self.today_in_zone(zone = ::Time.zone) ::Time.find_zone!(zone).today end end
使用DateTime
类
DateTime.now.in_time_zone 'Melbourne'
ruby-1.9.2-p0 :004 > Time.now => 2011-05-19 15:46:45 +0100 ruby-1.9.2-p0 :006 > Time.now.in_time_zone('Melbourne') => Fri, 20 May 2011 00:47:00 EST +10:00 ruby-1.9.2-p0 :007 > Time.now.in_time_zone('Melbourne').to_date => Fri, 20 May 2011
对于有效的时区名称,请参阅 : http : //api.rubyonrails.org/classes/ActiveSupport/TimeZone.html
在Rails 3中,您可以简单地通过在Date对象上调用to_time_in_current_zone来做到这一点。
Date.today.to_time_in_current_zone