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

时间:2011-07-07 18:38:02

标签: ruby timezone

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

时间字符串示例:

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

我花了很长时间试图弄明白这个。

我确实找到了类似的问题,但其答案并不适用于我的情况:How do I get Ruby to parse time as if it were in a different time zone?

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

有没有一种好方法可以完成我在这里要做的事情?

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

3 个答案:

答案 0 :(得分:10)

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

puts time
puts time.in_time_zone('EST')

答案 1 :(得分:1)

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

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

>> 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

答案 2 :(得分:1)

这是我提出的使用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" 

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