问题:
如何解析这样的值:
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中的任何Time
或DateTime
对象正确解析,同时在请求时返回时区。 / 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 "
答案 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"