Подтвердить что ты не робот

В Rails, как получить текущий часовой пояс (Time.zone) в формате, который можно использовать с ActiveSupport:: TimeZone [zone].parse()?

Как метод принимает текущую Time.zone и помещает его в формат, который можно использовать с помощью ActiveSupport::TimeZone[some_zone].parse()?

Кажется очень странным, что Time.zone.to_s возвращает строку, которая не может использоваться с ActiveSupport::TimeZone[zone].parse()

Time.zone.to_s возвращает "(GMT-08:00) Pacific Time (US & Canada)"

Но ActiveSupport::TimeZone["(GMT-08:00) Pacific Time (US & Canada)"] есть nil.

ActiveSupport::TimeZone["(GMT-08:00) Pacific Time (US & Canada)"]
=> nil

ActiveSupport::TimeZone["Pacific Time (US & Canada)"]
=> (GMT-08:00) Pacific Time (US & Canada)
4b9b3361

Ответ 1

Используйте Time.zone.name, а не Time.zone.to_s

[1] pry(main)> Time.zone.to_s
=> "(GMT-05:00) Eastern Time (US & Canada)"
[2] pry(main)> Time.zone.name
=> "Eastern Time (US & Canada)"
[3] pry(main)> ActiveSupport::TimeZone[Time.zone.name]
=> (GMT-05:00) Eastern Time (US & Canada)

Что касается того, как я получил это (по запросу), я просто знаю, что метод name существует на Time.zone. Если бы я не знал этого наизусть, я проверю документы. Если это не так, как вы говорите (и это, здесь), я обычно проверяю класс/модуль/объект Pry. Pry - альтернатива irb, которая позволяет мне делать что-то вроде

[1] pry(main)> cd Time.zone
[2] pry(#<ActiveSupport::TimeZone>):1> ls -m
Comparable#methods: <  <=  ==  >  >=  between?
ActiveSupport::TimeZone#methods: <=>  =~  at  formatted_offset  local  local_to_utc  name  now  parse  period_for_local  period_for_utc  to_s  today  tzinfo  utc_offset  utc_to_local
self.methods: __pry__
[3] pry(#<ActiveSupport::TimeZone>):1> name
=> "Eastern Time (US & Canada)"

ls -m в строке [2] выше выведет методы на объект (если вы прокрутите правую сторону, вы увидите там name). Вы можете видеть в [3], я могу вызвать name непосредственно на объект Time.zone, в котором я внутри, и получить результат, который вы ищете.