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

cpa*_*ass 10 ruby timezone

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

时间字符串示例:

'2010-02-05 01:00:01'
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

小智 11

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

puts time
puts time.in_time_zone('EST')
Run Code Online (Sandbox Code Playgroud)


cpa*_*ass 2

这是我按照建议使用 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')
 => #<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" 
Run Code Online (Sandbox Code Playgroud)

我相信这会满足我的需求,但我想知道我是否可以让时间实际上位于上面的时区(而不仅仅是 UTC)。