如何在Ruby中将以下时间从UTC转换为EST(不带Rails)?

时间:2018-03-29 17:00:42

标签: ruby-on-rails ruby time

我试图隐藏UTC时间" 2018-04-02T14:30:00Z"在纯Ruby中的EST。我注意到以下差异。如果我使用Rails解析UTC时间,然后添加EST zone_offset,我会得到与使用" in_time_zone"不同的时间。帮手。 9:30对10:30。

2.2.4 :001 > t = Time.parse "2018-04-02T14:30:00Z"
 => 2018-04-02 14:30:00 UTC 
2.2.4 :002 > t + Time.zone_offset("EST")
 => 2018-04-02 09:30:00 UTC 
2.2.4 :003 > t.in_time_zone('Eastern Time (US & Canada)')
 => Mon, 02 Apr 2018 10:30:00 EDT -04:00 

3 个答案:

答案 0 :(得分:1)

您可以尝试使用localtime方法,例如Time.parse("2018-04-02T14:30:00Z").localtime("-05:00").strftime("%m/%d/%Y %I:%M %p")来打印,以便让时间对象移除strftime

答案 1 :(得分:1)

Rails确实很好地完成了时区,并且在不使用它的情况下复制ActiveSupport::TimeWithZone#in_time_zone的结果将会很困难。

例如,正如您所指出的那样:

>> t = Time.parse "2018-04-02T14:30:00Z"
>> t.in_time_zone('Eastern Time (US & Canada)')
Mon, 02 Apr 2018 10:30:00 EDT -04:00

但请考虑您同样可以这样做:

>> t = Time.parse "2018-01-02T14:30:00Z"
>> t.in_time_zone('Eastern Time (US & Canada)')
Tue, 02 Jan 2018 09:30:00 EST -05:00

换句话说,ActiveSupport不仅可以免费处理您的时区,还可以处理您的标准/夏令时挑战。甚至不是moment.js会这样做(或者如果它会,我还没弄明白怎么样)。

您是否考虑过使用require 'active_support',这会在不使用所有Rails的情况下为您提供此功能?

答案 2 :(得分:0)

我相信"东部时间(美国和加拿大)"实际上是EDT而不是EST。这可以解释你的小时差异。

irb(main):014:0> t = Time.parse "2018-04-02T14:30:00Z"
=> 2018-04-02 14:30:00 UTC
irb(main):015:0> t.in_time_zone('EST')
=> Mon, 02 Apr 2018 09:30:00 EST -05:00
irb(main):016:0> t.in_time_zone('Eastern Time (US & Canada)')
=> Mon, 02 Apr 2018 10:30:00 EDT -04:00
irb(main):017:0> 

另见:https://time.is/ESThttps://time.is/EDT

此外,时区是一个巨大的痛苦,并经常打破我的大脑。