它看起來像的ActiveSupport並提供分析方法,你正在尋找(我一直在尋找過),畢竟!至少如果您嘗試解析的字符串是標準的ISO-8601格式(:db
格式)日期,則至少爲—。
如果您嘗試解析的日期已經在您的本地時區,那就很簡單!
> 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,但我能夠解決該問題,首先使用Da teTime.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
看起來它甚至可以分析其他格式,如時間#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
更多參考文檔鏈接:
感謝您發佈如此多的細節。您的DateTime.strptime()引用對於需要從數據庫中解析出ActiveRecord :: Base.connection.select_value()以字符串形式返回的日期的情況非常有用。 – Lee 2009-11-02 21:06:38
兇手回答。我沒有意識到Time.zone =「...」的工作。你爲我節省了很多時間。 – rhh 2010-08-04 19:23:44