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
实例上进行数学运算而不会丢失时区?
这可能与服务器的本地时间有关吗
答案 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