Как я могу использовать Ruby для синтаксического анализа времени, как если бы он был в часовом поясе, который я указываю, с зоной в формате America/Los_Angeles?
Я хочу иметь возможность анализировать время из строки в Ruby (1.8.7), где строка не содержит никакой информации о часовом поясе. Я хотел бы обрабатывать строку так, как если бы она была в любом из нескольких часовых поясов, указанных в этом типе формата: "Америка/Новый_York".
Пример строки времени:
'2010-02-05 01:00:01'
Я потратил немало времени, пытаясь понять это.
Я нашел аналогичный вопрос, но его ответ не применим в моем случае: Как мне заставить Ruby анализировать время, как если бы оно находилось в другом часовом поясе?
Проблема с вышеупомянутым решением заключается в том, что мои часовые пояса не могут быть представлены в трехбуквенном формате, поддерживаемом Time.parse(http://www.ruby-doc.org/stdlib-1.8.7/libdoc/time/rdoc/classes/Time.html#M004931).
Есть ли хороший способ выполнить то, что я пытаюсь сделать здесь?
Изменить: мой ответ на самом деле появился в качестве ответа.
Ответы
Ответ 1
Вот что я придумал использовать драгоценный камень tzinfo, как это было предложено, хотя для меня это кажется довольно сложным и неинтуитивным. В качестве конечного результата я получаю время, проанализированное так, как если бы оно находилось в часовом поясе, который я хотел, хотя он был представлен объектом Time в UTC. Я также могу отобразить его в часовом поясе, я хочу использовать tzinfo strftime:
jruby-1.6.1 :003 > time = '2010-05-01 01:00:00'
=> "2010-05-01 01:00:00"
jruby-1.6.1 :004 > tz = TZInfo::Timezone.get('America/New_York')
=> #<TZInfo::DataTimezone: America/New_York>
jruby-1.6.1 :005 > time += ' UTC'
=> "2010-05-01 01:00:00 UTC"
jruby-1.6.1 :006 > time = Time.parse(time)
=> Sat May 01 01:00:00 UTC 2010
jruby-1.6.1 :007 > time = tz.local_to_utc(time)
=> Sat May 01 05:00:00 UTC 2010
jruby-1.6.1 :010 > tz.strftime('%Y-%m-%d %H:%M:%S %Z', time)
=> "2010-05-01 01:00:00 EDT"
Я считаю, что это подойдет моим потребностям, но мне интересно, могу ли я получить время, чтобы на самом деле быть в часовом поясе наверху (вместо UTC).
Ответ 2
require 'active_support/all'
time = ActiveSupport::TimeZone.new('UTC').parse('2010-02-05 01:00:01')
puts time
puts time.in_time_zone('EST')
Ответ 3
У вас есть два варианта, как я его вижу. С одной стороны, вы можете сопоставить формат, который хотите использовать в массиве (или любой другой структуре), в 3-буквенном формате, используемом Time.parse.
Другой вариант - использовать tzinfo gem, как указано моим, который, кажется, делает работу довольно хорошо.
>> tz = TZInfo::Timezone.get("America/New_York")
=> #<TZInfo::DataTimezone: America/New_York>
>> tz.now
=> Thu Jul 07 16:29:13 UTC 2011
>> tz = TZInfo::Timezone.get("Europe/Rome")
=> #<TZInfo::DataTimezone: Europe/Rome>
>> tz.now
=> Thu Jul 07 22:30:03 UTC 2011