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

Posted

技术标签:

【中文标题】Rails 3:如何在特定时区获取今天的日期?【英文标题】:Rails 3: How to get today's date in specific timezone? 【发布时间】:2011-08-28 23:03:51 【问题描述】:

为了得到今天的日期,我这样做:

Date.today    # => Fri, 20 May 2011

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

我的application.rb 中有以下设置:

config.time_zone = 'Melbourne'

我设置:

Time.zone = 'Melbourne'

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

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

我如何在'Melbourne' 中获得今天的日期?

【问题讨论】:

【参考方案1】:

您应该可以这样做:Time.current。如果Time.zone 设置为,则将显示墨尔本的当前时间。

【讨论】:

Time.zone.now.to_date 最优雅!谢谢! Time.current.to_date 更好! 更适合任何 Date 对象:Date.today.to_time_in_current_zone @SlobodanKovacevic Date.today.to_time_in_current_zone 返回时间对象而不是日期对象。 @Ziggy: Time.current.beginning_of_day + 18.hours 也可以 :)【参考方案2】:

Date 对象不一定有时区,但Time 对象有。你可以试试Time,然后转换回Date

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

【讨论】:

【参考方案3】:
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

【讨论】:

【参考方案4】:

使用DateTime

DateTime.now.in_time_zone 'Melbourne'

【讨论】:

这是一种我以前从未见过的简洁的好方法。看起来 Time.now.in_time_zone 'Melbourne' 也可以。 这应该得到更多的支持。清晰,简洁,适用于日期,不需要 ActiveSupport,并且不涉及任何配置设置。【参考方案5】:

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

Date.today.to_time_in_current_zone

【讨论】:

如果服务器时间与 Rails 时区不同,Date.today 可能会返回昨天或明天的日期。然后调用to_time_in_current_zone 将使其成为Rails 区域中的时间,但时间可能是昨天或明天。如果您的日期已知位于正确的时区,例如 Time.zone.today,但会误导 Date.today,这将非常有用。【参考方案6】:

看来Time.zone.today 也可以。

【讨论】:

【参考方案7】:

对于有效的时区名称,请查看:http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html

【讨论】:

【参考方案8】:

如果您想在某个指定时区获得“今天”而不必更改 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

【讨论】:

【参考方案9】:

Date.current

Date.current 可能是最简洁明了的方式,在 Rails 3 中添加。

$ Date.current
#=> Sat, 14 Jul 2018

http://apidock.com/rails/v3.2.13/Date/current/class

【讨论】:

以上是关于Rails 3:如何在特定时区获取今天的日期?的主要内容,如果未能解决你的问题,请参考以下文章

Rails:在时区获取#beginning_of_day

如何将日期时间(在特定时区)转换为纪元秒

iOS Swift:当字符串包含时区缩写时,如何将特定的日期字符串格式转换为日期对象?

在 Rails 和 PostgreSQL 中完全忽略时区

如何在 Dynamics CRM 中获取时区的夏令时开始和结束?

Rails:使用Heroku时如何获取当前用户的时区