【问题标题】:How do you convert the following time from UTC to EST in Ruby (without Rails)?你如何在Ruby(没有Rails)中将以下时间从UTC转换为EST?
【发布时间】:2018-09-08 17:36:46
【问题描述】:
我试图在纯 Ruby 中将 UTC 时间“2018-04-02T14:30:00Z”转换为 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
【问题讨论】:
标签:
ruby-on-rails
ruby
time
【解决方案1】:
您可以尝试localtime 方法,例如Time.parse("2018-04-02T14:30:00Z").localtime("-05:00").strftime("%m/%d/%Y %I:%M %p") 来漂亮地打印以获取时间对象删除strftime
【解决方案2】:
我相信“东部时间(美国和加拿大)”实际上是 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/EST
和https://time.is/EDT
此外,时区是一个巨大的痛苦,经常让我的大脑崩溃。
【解决方案3】:
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 的情况下为您提供此功能?