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

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