解析包含区域偏移的时间字符串,并保留相同的区域

时间:2015-07-17 17:47:02

标签: ruby-on-rails ruby datetime timezone

问题:

如何解析这样的值:

2015-06-19 07:32:40 -0500

这样使用strftime('%Z')会给我美国时区的缩写吗?像这样:

Time.parse("2015-06-19 07:32:40 -0500").strftime("%Y %Z")
>> 2015 CDT

以上情况现在不会发生。

我开始认为它无法完成,因为-0500在世界不同地区有不同的缩写。

详情:

我使用的是Ruby 2.2.2。我不能为我的生活获得这种格式的字符串:2015-06-19 07:32:40 -0500可以通过ruby中的任何TimeDateTime对象正确解析,同时在请求时返回时区。 / p>

我需要做的是将字符串解析为DateTime(或类似),然后将该日期时间输出为包含时区缩写的字符串。以下是我的一些尝试:

这是需要解析为时区的值,它由函数作为字符串接收(如此处所示),无法更改。

?> time_string = obj.created_at.to_s
=> "2015-06-19 07:32:40 -0500"

-0500是CDT。 Time.parse在其结果中有正确的偏移量...但由于某种原因strftime根本没有显示任何时区信息......

>> Time.parse(time_string)
=> 2015-06-19 07:32:40 -0500
>> Time.parse(time_string).strftime("%Y %Z")
=> "2015 "

DateTime也有正确的偏移量,但%Z(应该是时区缩写)会逐字地返回偏移量...呃。

>> DateTime.parse(time_string)
=> Fri, 19 Jun 2015 07:32:40 -0500
>> DateTime.parse(time_string).strftime("%Y %Z")
=> "2015 -05:00"

Chronic是一个用于ruby的时间解析库,它有助于解决不同格式的字符串的一些麻烦......但是,它需要字符串并将它所拥有的任何时区转换为系统时区。 strftime工作正常,但长期已将结果的时区更改为不受欢迎的内容。

>> Chronic.parse(time_string)
=> Fri, 19 Jun 2015 06:32:40 MDT -06:00
>> Chronic.parse(time_string).strftime("%Y %Z")
=> "2015 MDT"

请注意,我无法更改时区设置,因为每次解析时间字符串时,它可能会有不同的偏移量,我希望 偏移量用作打印的时区。

有没有办法解析字符串以便保留偏移量,并在使用strftime('%Z')时显示? Chronic解决方案是理想的,但此时我会采取任何措施。

编辑:

一些更奇怪的发现。如果偏移位于当前系统时区中,则Time.parse

>> Time.parse("2015-06-19 06:32:40 -0600")
=> 2015-06-19 06:32:40 -0600
>> Time.parse("2015-06-19 05:32:40 -0700")
=> 2015-06-19 05:32:40 -0700
?> Time.parse("2015-06-19 06:32:40 -0600").strftime("%Y %Z")
=> "2015 MDT"
>> Time.parse("2015-06-19 05:32:40 -0700").strftime("%Y %Z")
=> "2015 "

1 个答案:

答案 0 :(得分:1)

不确定我完全理解,但是因为输入是已知的格式,所以strptime会更好吗?在我的系统上......

> Time.now.strftime('%Y %Z %z')
=> "2015 PDT -0700"
> DateTime.strptime("2015-06-19 05:32:40 -0600", "%Y-%m-%d %H:%M:%S %z").strftime('%Y %Z %z')
=> "2015 -06:00 -0600"
> DateTime.strptime("2015-06-19 05:32:40 -0700", "%Y-%m-%d %H:%M:%S %z").strftime('%Y %Z %z')
=> "2015 -07:00 -0700"