How can I use Ruby to parse a time as though it is in a time zone I specify, with zone in the format America/Los_Angeles?
我希望能够从Ruby(1.8.7)中的字符串解析时间,该字符串不包含任何时区信息。我想把这个字符串看作是在这种格式中指定的任意一个时区中:"美国/纽约"。
时间字符串示例:
1 | '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)。
有没有一个很好的方法来完成我想做的事情?
编辑:使我的答案实际显示为答案。
1 2 3 4 5 | require 'active_support/all' time = ActiveSupport::TimeZone.new('UTC').parse('2010-02-05 01:00:01') puts time puts time.in_time_zone('EST') |
以下是我根据建议使用TZINFO宝石的方法,尽管它对我来说似乎相当复杂和不具有启发性。作为最终结果,我得到了时间的解析,就好像它在我想要的时区中一样,尽管它由一个UTC时间对象表示。我也可以使用TZINFO的strftime在我想要的时区显示它:
1 2 3 4 5 6 7 8 9 10 11 12 | 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)。
我看你有两种选择。一方面,您可以将希望在数组(或任何其他结构)中使用的格式映射到Time.Parse使用的3个字母格式。
另一种选择是使用我指定的TZINFO GEM,这似乎可以很好地完成任务。
1 2 3 4 5 6 7 8 | >> 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 |