代码之家  ›  专栏  ›  技术社区  ›  Max Williams

Rails时间戳没有使用正确的时区

  •  14
  • Max Williams  · 技术社区  · 15 年前

    我对rails中的时区有些困惑。我希望我的rails应用程序使用英国夏令时(比如美国的夏令时)作为在updated和created中设置的时间戳。我改变了我的环境

      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
    

    所以,在做减法运算之前,更新的_at被转换成当前时区。

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

    有人能不同意我吗?干杯,麦克斯

    2 回复  |  直到 15 年前
        1
  •  41
  •   tadman    15 年前

    时间戳默认存储在UTC中,这可能是最好的方法。如果您从一个服务器环境移动到另一个服务器环境,您不希望所有的时间仅仅因为您切换了时区而四处移动。

    someobj.updated_at.localtime
    
        2
  •  2
  •   zetetic    15 年前

    请注意时间末尾列出的偏移量——第一个偏移量为0,第二个偏移量为1。进行时间计算时,将自动包含偏移量,以便减法得到正确的结果。 someobj.updated_at Time.now