Rails 5:将Time.zone(例如“Pacific Time(US& Canada)”)转换为带编号的偏移量(例如-0700)

时间:2017-05-04 22:12:38

标签: ruby-on-rails ruby time ruby-on-rails-5

这是我正在进行的一个问题,我不知道如何使用它。

用户在创建帐户时设置Time.zone。在这种情况下,“太平洋时间(美国和加拿大)”。

当他们创建一个对象并输入日期和时间时,它会以字符串的格式显示,没有明确的时区偏移,如“05/31/2017 2:00 PM”

了解这两件事。我想将输入的时间字符串转换为UTC格式并保存。

我已经尝试了以下但是没有考虑太平洋时间:

time = Time.strptime("05/31/2017 2:00 PM Pacific Time (US & Canada)", "%m/%d/%Y %H:%M %p %Z").utc
=> 2017-05-31 14:00:00 UTC

14:00:00 UTC是太平洋时间上午7点。应该是21:00:00,因为它目前是-0800。我想找到一种方法来考虑时区并以UTC格式正确保存它们。

然而,如果我给它一个确切的偏移,它会正确转换:

time = Time.strptime("05/31/2017 2:00 PM -0800", "%m/%d/%Y %H:%M %p %Z").utc
=> 2017-05-31 22:00:00 UTC

这个问题正在扼杀我。我只想以UTC格式保存所有日期和时间,这样用户所要做的就是正确设置他们的时区和查看时间。如果适用,还要考虑DST。

1 个答案:

答案 0 :(得分:1)

在Rails中,您可以使用ActiveSupport更改时区而不更改值并转换为utc

#parse time as usual
time = Time.strptime("05/31/2017 2:00 PM", "%m/%d/%Y %H:%M %p")

#convert to utc using timezone that you need
res = ActiveSupport::TimeZone.new('Pacific Time (US & Canada)').local_to_utc(time)
#> 2017-05-31 21:00:00 UTC