Rails 3:如何获取特定时区的今天的日期?


75

要获取今天的日期,我需要:

Date.today    # => Fri, 20 May 2011

我想获取特定时区的今天日期'Melbourne'

我的设定如下application.rb

config.time_zone = 'Melbourne'

然后我设置:

Time.zone = 'Melbourne'

在我的应用程序控制器中执行每个操作之前。

但是,它没有帮助(我猜是因为这些设置仅影响存储在数据库中的日期)。

我怎么能得到今天的日期'Melbourne'

Answers:


63

您应该可以执行以下操作:Time.current。如果Time.zone设置了该时间,它将显示墨尔本的当前时间。


6
Time.zone.now.to_date是最优雅的!谢谢!
Misha Moroshko

25
Time.current.to_date更好!
Misha Moroshko 2011年

5
对于任何Date对象,甚至更好:Date.today.to_time_in_current_zone
Slobodan Kovacevic

2
@SlobodanKovacevic Date.today.to_time_in_current_zone返回一个Time对象而不是Date对象。
乔什

1
@Ziggy:Time.current.beginning_of_day + 18.hours也会起作用:)
Ryan Bigg

68

Date对象不一定具有时区,但Time对象却具有时区。您可以将其作为尝试Time,然后转换回Date

Time.now.to_date
# => Thu, 19 May 2011 
Time.now.in_time_zone('Melbourne').to_date
# => Fri, 20 May 2011 


16

如果您想在某个指定时区获得“今天”而不必更改Time.zone,我会做类似fl00r的事情,而Dylan Markow建议:

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


7

使用DateTime

DateTime.now.in_time_zone 'Melbourne'

这是我以前从未见过的一种很好,简洁的方法。看起来Time.now.in_time_zone'墨尔本'也可以使用。
泰勒·里克

1
这应该被更多赞成。清晰,简洁,可以处理日期,不需要ActiveSupport,并且不涉及配置设置中的任何问题。
JacobEvelyn 2013年

2
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


1

在Rails 3中,您可以通过在Date对象上调用to_time_in_current_zone来简单地做到这一点。

Date.today.to_time_in_current_zone

1
如果服务器时间与Rails时区不同,则Date.today 可能返回昨天或明天的日期。呼叫to_time_in_current_zone将使它成为Rails区域中的时间,但可能是昨天或明天。如果您知道某个日期在正确的时区(例如Time.zone.today,始于,但误导了),则此功能很有用Date.today
亨里克·N
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.