9

我正在尝试使用 Ruby 2.0 中的 Time 类解析日期时间。我不知道如何解析日期并在指定的时区获取它。我曾经Time.zone.parse解析我第一次调用的日期Time.zone并将其设置为指定的时区。在下面的示例中,我设置了区域但它不起作用strptime,我尝试过这样做Time.zone.parse(date)但我无法让它解析像下面这样的日期。

Time.zone = "Central Time (US & Canada)"
#=> "Central Time (US & Canada)"
irb(main):086:0> Time.strptime("08/26/2013 03:30 PM","%m/%d/%Y %I:%M %p")
#=> 2013-08-26 15:30:00 -0400
4

3 回答 3

8

Time.zone不是 Ruby 的一部分,它是ActiveSupport(包含在 Rails 中)的一部分。因此,strptime根本不知道Time.zone。但是,您可以使用 将普通的 Ruby Time 转换为ActiveSupport::TimeWithZonein_time_zone ,默认情况下它使用' Time.zones 值:

require 'active_support/core_ext/time'
Time.zone = 'Central Time (US & Canada)'

time = Time.strptime('08/26/2013 03:30 PM', '%m/%d/%Y %I:%M %p')
#=> 2013-08-26 15:30:00 -0400
time.in_time_zone
#=> Mon, 26 Aug 2013 14:30:00 CDT -05:00
于 2013-08-09T01:18:24.373 回答
1

如果您只关注 Ruby2.0,您可能会发现 time lib 很有用:

require 'time'
time.zone # return your current time zone

a = Time.strptime("08/26/2013 03:30 PM","%m/%d/%Y %I:%M %p")
# => 2013-08-26 15:30:00 +1000
a.utc  # Convert to UTC
a.local # Convert back to local
# Or you can add/subtract the offset for the specific time zone you want:
a - 10*3600 which gives UTC time too
于 2013-08-09T02:12:16.333 回答
1

strptime从时间字符串中获取其参数。因此,时间字符串必须包含时区信息。

如果您正在解析特定时区的时间字符串,但您收到的时间字符串没有嵌入 - 那么您可以在将时间字符串传递给之前添加时区信息srtptime,并要求strptime使用%z或名称解析时区偏移量使用%Z.

简而言之,如果您有一个时间字符串08/26/2013 03:30 PM并且希望在UTC时区中对其进行解析,您将拥有:

str = '08/26/2013 03:30 PM'
Time.strptime("#{str} UTC}", "%m/%d/%Y %I:%M %p %Z")
于 2017-10-19T09:42:42.320 回答