【问题标题】:In Rails, how do I convert and print a time to a different time zone?在 Rails 中,如何将时间转换并打印到不同的时区?
【发布时间】:2011-01-19 21:17:36
【问题描述】:

我有一个变量,start_time:

(rdb:5) start_time.class
ActiveSupport::TimeWithZone

(rdb:5) start_time
Tue, 23 Feb 2010 14:45:00 EST -05:00

(rdb:5) start_time.in_time_zone(ActiveSupport::TimeZone::ZONES_MAP["Pacific Time (US & Canada)"]).zone
"PST"

(rdb:5) start_time.in_time_zone(ActiveSupport::TimeZone::ZONES_MAP["Pacific Time (US & Canada)"]).to_s(:time)
"2:45 PM ET"

我想更改 'to_s(:time)' 以便它输出变量中指定的任何区域的时间,而不是默认系统时间。 IE。输出将是“太平洋时间上午 11:45”。我该怎么做?

【问题讨论】:

  • 触摸。我应该为此做点什么。

标签: ruby-on-rails ruby datetime timezone


【解决方案1】:

我想你想创建一个TimeZone 对象,并使用它的at() 方法:

start_time = Time.now 
start_time.rfc822                          # => "Tue, 23 Feb 2010 10:58:23 -0500"
pst = ActiveSupport::TimeZone["Pacific Time (US & Canada)"]
pst.at(start_time).strftime("%H:%M %p %Z") # => "08:00 AM PST"

【讨论】:

    【解决方案2】:

    我最近遇到了这个问题,并且能够通过覆盖我正在使用的 .to_s 选项来解决它。我创建了一个名为 time_formats.rb 的初始化程序,并在其中添加了以下行。

    Time::DATE_FORMATS[:time_in_zone] = "%H:%M %p"
    

    然后像这样将(:time) 更改为(:time_in_zone)...

    start_time.in_time_zone(...your timezone here...]).to_s(:time_in_zone)
    

    它应该给你指定区域的时间。我的环境是 UTC,所以也许这与它有关......

    【讨论】:

      【解决方案3】:

      鉴于 Beerlington 的 cmets,我最终添加了以下内容(类似于为 Time::DATE_FORMATS[:time] 定义的 Proc

      :time_in_zone  => lambda { |time|
          time = time.strftime("%I:%M %p %Z").gsub(/([NAECMP])([DS])T$/, '\1T')
          time = time[1..-1] if time =~ /^0/ # drop leading zeroes
          time
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-30
        • 2021-02-18
        • 2019-02-22
        • 2017-06-07
        • 2019-06-21
        • 2014-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多