在Rails中,如何将时间转换并打印到不同的时区?

时间:2010-02-22 23:51:28

标签: ruby-on-rails ruby datetime timezone

我有一个变量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)',以便它在变量中指定的任何区域输出时间,而不是默认的系统时间。即输出将是“上午11:45 PT”。我该怎么做?

3 个答案:

答案 0 :(得分:3)

我认为您要创建一个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"

答案 1 :(得分: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,所以也许这与它有关...

答案 2 :(得分:0)

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

: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
}