Похоже, ActiveSupport действительно предоставляет методы анализа, которые вы ищете (и я тоже искал), в конце концов! & Mdash; по крайней мере, если строка, которую вы пытаетесь проанализировать, является стандартной датой в формате ISO-8601 (:db
format).
Если дата, которую вы пытаетесь проанализировать, уже находится в вашем местном часовом поясе, это действительно просто!
> Time.zone.parse('2009-09-24 08:28:43')
=> Thu, 24 Sep 2009 08:28:43 PDT -07:00
> Time.zone.parse('2009-09-24 08:28:43').class
=> ActiveSupport::TimeWithZone
и это время с учетом часового пояса можно легко преобразовать в UTC
> Time.zone.parse('2009-09-24 08:28:43').utc
=> 2009-09-24 15:28:43 UTC
или в другие часовые пояса:
> ActiveSupport::TimeZone.us_zones.map(&:name)
=> ["Hawaii", "Alaska", "Pacific Time (US & Canada)", "Arizona", "Mountain Time (US & Canada)", "Central Time (US & Canada)", "Eastern Time (US & Canada)", "Indiana (East)"]
> Time.zone.parse('2009-09-24 08:28:43').utc.in_time_zone('Eastern Time (US & Canada)')
=> Thu, 24 Sep 2009 11:28:43 EDT -04:00
Если строка с датой, которую вы пытаетесь проанализировать, находится в UTC, с другой стороны, не похоже, что есть какой-либо метод для ее анализа напрямую в TimeWithZone, но я смог Чтобы обойти это, сначала используйте DateTime.strptime ...
Если дата, которую вы пытаетесь проанализировать, указана в UTC и вы хотите, чтобы она оставалась в формате UTC, вы можете использовать:
> DateTime.strptime('2009-09-24 08:28:43', '%Y-%m-%d %H:%M:%S').to_time
=> 2009-09-24 08:28:43 UTC
Если дата, которую вы пытаетесь проанализировать, указана в формате UTC и вы хотите, чтобы она была преобразована в ваш часовой пояс по умолчанию, вы можете использовать:
> DateTime.strptime('2009-09-24 08:28:43', '%Y-%m-%d %H:%M:%S').to_time.in_time_zone
=> Thu, 24 Sep 2009 01:28:43 PDT -07:00
Похоже, что он может даже анализировать другие форматы, такие как странный формат, который производит Time # to_s:
irb -> Time.zone.parse('Wed, 23 Sep 2009 02:18:08').to_s(:db)
=> "2009-09-23 09:18:08"
irb -> Time.zone.parse('Wed, 23 Sep 2009 02:18:08 EDT').to_s(:db)
=> "2009-09-23 06:18:08"
Я впечатлен.
Вот еще несколько примеров из [http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html][1]:
Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)'
Time.zone.local(2007, 2, 10, 15, 30, 45) # => Sat, 10 Feb 2007 15:30:45 EST -05:00
Time.zone.parse('2007-02-10 15:30:45') # => Sat, 10 Feb 2007 15:30:45 EST -05:00
Time.zone.at(1170361845) # => Sat, 10 Feb 2007 15:30:45 EST -05:00
Time.zone.now # => Sun, 18 May 2008 13:07:55 EDT -04:00
Time.utc(2007, 2, 10, 20, 30, 45).in_time_zone # => Sat, 10 Feb 2007 15:30:45 EST -05:00
Дополнительные ссылки на документацию для справки: