TimeWithZone数学失去时区。 Rails 3.2.17错误?

时间:2014-05-01 18:06:08

标签: ruby-on-rails ruby time timezone

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实例上进行数学运算而不会丢失时区?

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

3 个答案:

答案 0 :(得分: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)'

答案 1 :(得分:0)

一种方法是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

关于使用ActiveSupport::TimeWithZone生成的1.year.ago的类似问题here,但1.year Float的持续时间不能与{{1}}相关联它是afaik,所以在街区内工作可能是最简单的。

答案 2 :(得分:0)

终于弄清楚发生了什么。 Time.new(显然在后见之明)不会创建ActiveSupport::TimeWithZone实例。因此,如果我只是通过Time转换in_time_zone,那么这一切都可以正常运行。

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