【发布时间】:2010-11-18 18:26:55
【问题描述】:
我有一个基于 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 时间发送,这个'off通过一小时的 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
【问题讨论】:
标签: ruby-on-rails datetime timezone dst