【问题标题】:Rails 5: Convert Time.zone (e.g "Pacific Time (US & Canada)" ) into a numbered offset (e.g -0700)Rails 5:将 Time.zone(例如 "Pacific Time (US & Canada)" )转换为带编号的偏移量(例如 -0700)
【发布时间】:2017-05-04 22:12:37
【问题描述】:

这是我一直遇到的问题,我不知道如何解决。

用户在创建帐户时设置他们的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。

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 成功了!我现在可以将时间转换并保存为 UTC,并且转换工作正常。
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2015-11-20
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多