Как я могу использовать 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