Как в Rails конвертировать и печатать время в другой часовой пояс? - PullRequest
4 голосов
/ 23 февраля 2010

У меня есть переменная, 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 ]

3 голосов
/ 23 февраля 2010

Я думаю, что вы хотите создать 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 голосов
/ 23 февраля 2010

Я недавно столкнулся с этой проблемой и смог решить ее, существенно переопределив опцию .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, так что, возможно, это как-то связано с этим ...

0 голосов
/ 23 февраля 2010

Учитывая комментарии Берлингтона, я добавил следующее (что похоже на 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...