确实非常奇怪的错误。我有一个每个月都会克隆自己的项目,将下一个对象设置为将来有一个scheduled_on
日期+ 1.months
。
但后来发生了这种情况:
Sun, 01 Apr 2012 16:00:00 PDT -07:00
Tue, 01 May 2012 16:00:00 PDT -07:00
Fri, 01 Jun 2012 16:00:00 PDT -07:00
Sun, 01 Jul 2012 16:00:00 PDT -07:00
Wed, 01 Aug 2012 16:00:00 PDT -07:00
Fri, 31 Aug 2012 17:00:00 PDT -07:00 # <--- What in the..
编码 :
def clone_object
objects = []
Time.zone = account.timezone
Chronic.time_class = Time.zone
now = last_scheduled_on.to_time # <- this would have been Wed, 01 Aug 2012 16:00:00 PDT -07:00
new_date = now + 1.months
new_schedule = Time.zone.parse new_date.strftime('%Y-%m-%d' + ' ' + original_scheduled_on.strftime('%H:%M:%S'))
objects << clone!(:scheduled_on => new_schedule, :recurring_job_id => id)
end
这是实际代码的一个非常截断的版本。但它包括我合理影响这个问题的所有部分。
所以问题是..这个错误怎么可能发生?
更新
我很确定这与时区有关。
以下是 UTC 日期:
In UTC :
Sun, 01 Apr 2012 23:00:00 UTC +00:00
Tue, 01 May 2012 23:00:00 UTC +00:00
Fri, 01 Jun 2012 23:00:00 UTC +00:00
Sun, 01 Jul 2012 23:00:00 UTC +00:00
Wed, 01 Aug 2012 23:00:00 UTC +00:00
Sat, 01 Sep 2012 00:00:00 UTC +00:00
Sun, 30 Sep 2012 23:00:00 UTC +00:00
在这里,它们被转换为 Pacific :
In Pacific
Sun, 01 Apr 2012 16:00:00 PDT -07:00
Tue, 01 May 2012 16:00:00 PDT -07:00
Fri, 01 Jun 2012 16:00:00 PDT -07:00
Sun, 01 Jul 2012 16:00:00 PDT -07:00
Wed, 01 Aug 2012 16:00:00 PDT -07:00
Fri, 31 Aug 2012 17:00:00 PDT -07:00
Sun, 30 Sep 2012 16:00:00 PDT -07:00
我还注意到我放在这里的代码对我的服务器不准确。服务器将 Time.zone 设置为最后一个作业,而不是帐户的 timezone。这意味着(或者至少我认为这意味着)时区是浮动和动态的。但这也让我感到困扰,因为加利福尼亚的夏令时直到 11 月才转换,而不是 9 月。