【问题标题】: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
}