【问题标题】:Rails timestamps don't use the right timezoneRails 时间戳没有使用正确的时区
【发布时间】:2011-05-01 09:42:18
【问题描述】:

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

  config.time_zone = 'London'

我的应用程序所在的 ubuntu 服务器似乎在使用 BST:例如,在命令行中,如果我输入“日期”,我会得到当前时间(不偏移一个小时)。在 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”助手解决的,该助手会根据时区进行调整。不过,我仍然希望有人解释时间戳是怎么回事:)

【问题讨论】:

    标签: ruby-on-rails datetime timezone


    【解决方案1】:

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

    如果你想知道你当地时区的时间戳是什么,你只需要这样问:

    someobj.updated_at.localtime
    

    【讨论】:

    • 啊——太好了。谢谢!我同意将它们全部保留在 UTC 中是有道理的。
    • 好的,我明白了。但是如果我想在我的视图中选择日期时间显示本地时间,我该怎么办?
    • 可能最好的方法是使用 JavaScript 方法将系统时间映射到浏览器本地时间。这是另一个问题。
    • 为了根据您的需要预填充datetime_select,请使用:default => Time.now.localtime 之类的内容。关于 edit 操作,这可能会有所帮助:stackoverflow.com/questions/15209130/…
    • 从来不知道localtime,很好。
    【解决方案2】:

    注意时间末尾列出的偏移量——第一个偏移量是 0,第二个是 1。当时间计算发生时,偏移量会自动包含在内,这样减法就会给你正确的结果。 someobj.updated_atTime.now 各自在不同的时区显示其值,因此它们实际上仅相隔 9 秒,而不是 1 小时 9 秒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 2014-02-12
      • 1970-01-01
      相关资源
      最近更新 更多