【问题标题】:Rails not accounting for daylight savings timeRails 不考虑夏令时
【发布时间】:2012-10-12 12:35:58
【问题描述】:
ActiveSupport::TimeZone.new("Pacific Time (US & Canada)")
=> (GMT-08:00) Pacific Time (US & Canada)

...但是现在,由于 DST,在洛杉矶是 GMT-07:00。见http://www.timeanddate.com/worldclock/city.html?n=137

这是一个错误、我的设置错误,还是我不正确地创建了 TimeZone 对象?看不懂

【问题讨论】:

    标签: ruby ruby-on-rails-3


    【解决方案1】:

    想通了。结果发现 TimeZone 对象确实有一个“现在”的概念:

    tz = ActiveSupport::TimeZone.new("Pacific Time (US & Canada)")
    => (GMT-08:00) Pacific Time (US & Canada) 
    tz.parse('8:00AM')
    => Fri, 12 Oct 2012 08:00:00 PDT -07:00
    

    因此,您仍然可以使用 TimeZone 创建具有正确偏移量的 TimeWithZone 对象——尽管它的 to_s 方法显示了不正确的偏移量。

    【讨论】:

    • 有什么方法可以在我的 Rails 应用中禁用夏令时?
    【解决方案2】:

    我不相信ActiveSupport::TimeZone 对象有“现在”的概念。您可以使用 ::create 以秒为单位的任何 utc_offset 初始化 TimeZone:

    ActiveSupport::TimeZone.create("Pacific Time (US & Canada)", -(60 * 60 * 7))
    #  => (GMT-07:00) Pacific Time (US & Canada)
    

    在处理 ActiveSupport::TimeWithZone 对象时,与夏令时相关的 now 概念更有意义。当您通过在 application.rb 中设置时区来让 Rails 应用程序感知时区时:

    config.time_zone = 'Pacific Time (US & Canada)'
    

    ...如果您使用Time.zone.now,结果将考虑夏令时,GMT-07:00。所以在这篇文章的时候:

    Time.zone.now
    => Fri, 12 Oct 2012 07:03:51 PDT -07:00
    
    Time.zone.now.class
    => ActiveSupport::TimeWithZone
    

    【讨论】:

    • 这是有道理的。但问题仍然存在:我需要创建一个确实有“现在”概念的时区。该时区可能会因用户而异,因此我不是在寻找依赖硬编码配置参数的解决方案。
    • 另外,我知道可以通过手动检查 Time.now.dst 来调整偏移量?如果属实,则增加一个小时。但我认为,如果 Rails 的 Time.now 可以获取正确的时区,那么无论应用程序特定的设置如何,都必须有一种方法可以在该国其他任何地方做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 2011-08-14
    • 2018-01-01
    • 2013-09-15
    • 2020-09-12
    • 2020-03-01
    • 2018-02-04
    • 2017-09-15
    相关资源
    最近更新 更多