Как я могу использовать Ruby для анализа времени, как если бы оно было в указанном часовом поясе, с поясом в формате America / Los_Angeles? - PullRequest
10 голосов
/ 07 июля 2011

Я хочу иметь возможность анализировать время из строки в Ruby (1.8.7), где строка не содержит никакой информации о часовом поясе.Я хотел бы обработать строку, как если бы она была в любом из нескольких часовых поясов, указанных в этом формате: «America / New_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 ).

Есть ли хороший способ выполнить то, что я пытаюсь сделать здесь?

Редактировать: Сделал мой ответ фактически отображаемым как ответ.

Ответы [ 3 ]

10 голосов
/ 10 апреля 2012
require 'active_support/all'
time = ActiveSupport::TimeZone.new('UTC').parse('2010-02-05 01:00:01')

puts time
puts time.in_time_zone('EST')
1 голос
/ 08 июля 2011

Вот то, что я придумал, используя гем tzinfo, как и предлагалось, хотя он кажется мне довольно сложным и не интуитивно понятным.В результате я получаю проанализированное время, как если бы оно было в желаемом часовом поясе, хотя оно представлено объектом UTC в формате UTC.Я также могу отобразить его в часовом поясе, который я хочу, используя strftime tzinfo:

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).

1 голос
/ 08 июля 2011

У меня есть два варианта, как я это вижу. С одной стороны, вы можете отобразить формат, который вы хотите использовать в массиве (или любую другую структуру, которую вы хотите), в 3-х буквенный формат, используемый Time.parse.

Другой вариант - использовать гем tzinfo, как указано в my, что, кажется, хорошо выполняет эту работу.

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