【问题标题】:TimeWithZone math loses time zone. Rails 3.2.17 bug?TimeWithZone 数学失去时区。 Rails 3.2.17 错误?
【发布时间】:2014-05-01 18:06:08
【问题描述】:

Rails 3.2.17、Ruby 2.0.0 出现在 Heroku 和我的 OSX 10.9.2 上。

计算完后,它会将时区设置为本地时区。

date = Time.new Time.zone.now.year, 7, 1, 0, 0, 0, '+05:00'
#=> 2014-07-01 00:00:00 +05:00

date - 1.year
#=> 2013-07-01 00:00:00 -0700
#                        ^ Booo, timezone is now local to host machine

所以我在时区创建时间,一切都很好。我试图得到完全相同的时间,一年前突然我在我当地的时区。这似乎不对。

如何在TimeWithZone 实例上进行数学运算而不丢失时区?

这可能与服务器的本地时间有关

【问题讨论】:

  • 哪个 Ruby 版本、Rails 版本和 OS 版本?此外,您是否在 Rails 应用程序/其他地方使用 Rails 或初始化程序以外的任何 gem 可能正在修补 Time 等?
  • Rails 3.2.17,Ruby 2.0.0,在 Heroku 和我的 OSX 10.9.2 上都出现
  • 哦,废话,我收回了……这发生在 Heroku 上,不会发生在我的 mac 上。什么鬼……
  • 实际上我收回了那个收回......它将时区设置为主机本地的区域,而不考虑原始时区。
  • 更新(替换)我下面的答案,现在我理解得更好了。

标签: ruby-on-rails ruby time timezone


【解决方案1】:

您需要通过以下方式抵消您的 Heroku 时区:

heroku config:add TZ=America/Los_Angeles

然后再次运行 Time.now。

更新:

这也有效

将以下内容添加到 application.rb 作品

 config.time_zone = 'Eastern Time (US & Canada)'
 config.active_record.default_timezone = 'Eastern Time (US & Canada)'

【讨论】:

  • 这里不是真正的解决方案,而是一个我不知道的非常有用的东西!
【解决方案2】:

一种方法是use_zone,它允许您指定一个块,您在其中使用定义的区域:

Loading development environment (Rails 4.0.4)
2.1.1 :001 > date = Time.new Time.zone.now.year, 7, 1, 0, 0, 0, '+05:00'
 => 2014-07-01 00:00:00 +0500 
2.1.1 :002 > Time.use_zone(date.zone) { date - 1.year }
 => 2013-07-01 00:00:00 +0500

类似的问题here 关于使用由1.year.ago 生成的ActiveSupport::TimeWithZone,但是像1.year 这样的持续时间是Float 不能有与之关联的时区,所以在块内工作可能是最简单的。

【讨论】:

    【解决方案3】:

    终于搞清楚是怎么回事了。 Time.new(显然事后看来)不会创建 ActiveSupport::TimeWithZone 实例。因此,如果我只是通过in_time_zone 转换Time,那么一切都会按我的预期工作。

    date = Time.new(Time.zone.now.year, 7, 1, 0, 0, 0, Time.zone.now.strftime('%:z')).in_time_zone
    # Tue, 01 Jul 2014 00:00:00 PDT -07:00
    
    date - 1.year
    # Mon, 01 Jul 2013 00:00:00 PDT -07:00
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 2011-03-13
      • 1970-01-01
      相关资源
      最近更新 更多