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

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

Date.today    # => Fri, 20 May 2011

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

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

config.time_zone = 'Melbourne'

我设置:

Time.zone = 'Melbourne'

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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 date timezone


    【解决方案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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2023-03-25
                • 1970-01-01
                • 1970-01-01
                • 2011-07-06
                • 2017-04-28
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多