結局のところ、ActiveSupport はあなたが探している (そして私も探していた) 解析メソッドを提供しているようです! — 少なくとも、解析しようとしている文字列が標準の 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
参照用のその他のドキュメント リンク: