2010-10-27 57 views
13

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

config.time_zone = 'London' 

Ubuntu的服务器我的应用程序是似乎是它的时间来使用BST:在命令行中,例如,如果我输入“日期”我得到的当前时间(没有被一小时抵消)。在导轨控制台中,我看到以下内容:

>> 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分钟前”而非“1小时前” ”。

任何人都可以解除我的困惑吗?欢呼声,最大

编辑:我的直接问题,在状态显示正确的时间,是通过使用'time_ago_in_words'助手,它调整时区解决。尽管如此,我仍然希望有人解释时间戳发生了什么:)

回答

38

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

如果你想知道的时间戳是在您的本地时区是什么,你只需要问这样的说法:

someobj.updated_at.localtime 
+0

啊 - 这是伟大的。谢谢!我同意将它们全部保存为UTC是有道理的。 – 2010-10-29 09:17:11

+0

好的,我明白了。 但如果我想在datetime上显示本地时间选择我的视图我该怎么办? – Diego 2011-02-01 23:20:44

+0

可能最好的方法是使用JavaScript方法将系统时间映射到浏览器本地时间。但这是另一个问题。 – tadman 2011-02-02 15:16:33

2

请注意在时间结束时列出的偏移量 - 第一个偏移量是0,第二个偏移量是1.当计算时间时,偏移量会自动包含在内,这样减法就会给出正确的结果。 someobj.updated_atTime.now每个在不同时区显示其值,所以它们实际上仅相隔9秒,而不是1小时和9秒。