Rails时间戳不使用正确的时区

时间:2010-10-27 15:37:53

标签: ruby-on-rails datetime timezone

我对rails中的时区感到有点困惑。我希望我的rails应用程序在我的模型中的updated_at和created_at中设置的时间戳使用英国夏令时(如美国的夏令时)。我改变了我的environment.rb说

  config.time_zone = 'London'

我的应用程序所在的ubuntu服务器似乎在时间上使用BST:例如,在命令行中,如果我输入'date',我会得到当前时间(不会偏移一小时)。在rails控制台中,我看到以下内容:

>> time = Time.now
=> Wed Oct 27 16:29:17 +0100 2010
>> time.zone
=> "BST"

一切都很好。但是,如果我创建一个新的AR模型对象并保存它,时间戳是从一小时前开始的。所以,看起来这是使用UTC。现在,我可以看到这里的逻辑:由于时间戳可能在模型逻辑中使用,因此您希望它们基于不变的尺度时间,即UTC。但是,这是一个奇怪的行为,我不明白:

#change a record and save it
>> someobj.save
=> true
#object's updated_at is one hour ago
>> someobj.updated_at
=> Wed, 27 Oct 2010 15:34:22 UTC +00:00
>> Time.now
=> Wed Oct 27 16:34:31 +0100 2010
#however, Time.now - object's updated at is just a few seconds.
>> Time.now - someobj.updated_at
=> 15.305549

因此,在进行减法之前,updated_at将转换为当前时区。

我想在当前时区显示日期的原因仅适用于视图中的状态报告等:如果有人更新某些内容,我希望他们看到它已在1分钟前更新,而不是“一小时前”

有人可以让我不相信吗?干杯,最大

编辑:通过使用调整时区的'time_ago_in_words'帮助器解决了我在状态中显示正确时间的直接问题。我仍然希望有人解释时间戳的内容:)

2 个答案:

答案 0 :(得分:40)

默认情况下,时间戳以UTC格式存储,这可能是最好的方法。如果您从一个服务器环境移动到另一个服务器环境,您不希望所有时间都因为您切换时区而转移。

如果您想知道当地时区的时间戳,您只需要这样询问:

someobj.updated_at.localtime

答案 1 :(得分:2)

注意时间结束时列出的偏移量 - 第一个偏移量为0,第二个偏移量为1.当发生时间计算时,自动包含偏移量,以便减法给出正确的结果。 someobj.updated_atTime.now每个都在不同的时区显示其值,因此它们实际上只相隔9秒,而不是1小时9秒。