我如何使用Ruby来解析时间,就好像它在我指定的时区中一样,区域的格式为America / Los_Angeles?

我希望能够从Ruby(1.8.7)中的字符串解析Time,其中字符串不包含任何时区信息。 我想把字符串看作是在这种格式中指定的任何时区中的任何一个:’America / New_York’。

时间字符串示例:

'2010-02-05 01:00:01' 

我花了很长时间试图弄清楚这个。

我确实找到了类似的问题,但它的答案并不适用于我的情况: 我如何让Ruby解析时间,好像它处于不同的时区?

上述解决方案的问题在于我的时区不能全部用Time.parse支持的3字母格式表示( http://www.ruby-doc.org/stdlib-1.8.7/libdoc/time/rdoc /classes/Time.html#M004931 )。

有没有一个好方法来完成我在这里要做的事情?

编辑:我的回答实际上是一个答案。

 require 'active_support/all' time = ActiveSupport::TimeZone.new('UTC').parse('2010-02-05 01:00:01') puts time puts time.in_time_zone('EST') 

我有两种选择。 一方面,您可以将您希望在数组中使用的格式(或您希望的任何其他结构)映射到Time.parse使用的3字母格式。

另一个选择是使用我指定的tzinfo gem,它似乎很好地完成了这项工作。

 >> tz = TZInfo::Timezone.get("America/New_York") => # >> tz.now => Thu Jul 07 16:29:13 UTC 2011 >> tz = TZInfo::Timezone.get("Europe/Rome") => # >> tz.now => Thu Jul 07 22:30:03 UTC 2011 

以下是我提出的使用tzinfo gem的建议,虽然它看起来相当复杂,对我来说不直观。 作为最终结果,我将时间解析为好像它在我想要的时区,尽管由UTC中的Time对象表示。 我也可以使用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') => # 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)。