我有一个基于 Rails 时间的查询,它有一些奇怪的时区敏感行为,尽管据我所知我使用的是 UTC。简而言之,这些查询给出了不同的答案:
>> Model.find(:all,:conditions=>['created_at<=?',(Time.now-1.hours).gmtime]).length
=> 279
>> Model.find(:all,:conditions=>['created_at<=?',(Time.now-1.hours)]).length
=> 280
数据库实际上包含一个在最后一小时创建的模型,模型总数为 280。所以只有第一个查询是正确的。
但是,在 environment.rb 我有:
config.time_zone = 'UTC'
系统时区(由“日期”报告)是 BST(即 GMT+1) - 所以不知何故,这最终会被视为 UTC 并中断查询。
这给我带来了各种各样的问题,因为我需要将在不同时间传递的查询参数化为一个动作(然后使用 Time.parse() 进行转换),即使我以 UTC 时间发送,这也会“关闭一小时” ' DST 问题作物很多。即使使用 '.gmtime()' 似乎并不总是能解决它。
显然,差异是由某处的隐式转换导致 BST 被错误地视为 UTC 造成的,但为什么呢?Rails 不是以 UTC 格式存储时间戳吗?Time 类时区不知道吗?我正在使用 Rails 2.2.2
那么这里发生了什么 - 围绕它进行编程的安全方法是什么?
编辑,一些附加信息来显示 DB 和 Time 类在做什么:
>> Model.find(:last).created_at
=> Tue, 11 Aug 2009 20:31:07 UTC +00:00
>> Time.now
=> Tue Aug 11 22:00:18 +0100 2009
>> Time.now.gmtime
=> Tue Aug 11 21:00:22 UTC 2009