Time.now& Created_at有什么不同? Ruby on Rails

时间:2010-03-25 00:47:43

标签: ruby-on-rails

我的网站部署在heroku上。 Time.now今天将返回,但是记录的created_at字段(现在创建)将在明天说明。我认为这与服务器时间有关吗?

有没有办法确保它们是一样的? 最好, 埃利奥特


更新所以我做了这个“heroku rake time:zones:us”

它给了我:

    * UTC -10:00 *
Hawaii

* UTC -09:00 *
Alaska

* UTC -08:00 *
Pacific Time (US & Canada)

* UTC -07:00 *
Arizona
Mountain Time (US & Canada)

* UTC -06:00 *
Central Time (US & Canada)

* UTC -05:00 *
Eastern Time (US & Canada)
Indiana (East)

然而,当我在我的环境中设置config.time_zone ='UTC -05:00'时,应用程序无法启动。任何想法?

4 个答案:

答案 0 :(得分:16)

Rails始终将UTC时间存储在数据库中; created_at字段本身应该相当于您的时区相对于UTC的变化。

每当您在应用程序中加载记录时,字段都会转换为environment.rb中指定的时区。它可能有这样的东西:

config.time_zone = 'UTC'

要将时间正确转换为您的时区,您可以将此配置设置更改为与实际时区匹配的设置。例如:

config.time_zone = 'Central Time (US & Canada)'

要查看可用区域,请在rails目录上发出“rake -D time”。这将为您提供有关如何获取时区名称以供配置使用的说明。

答案 1 :(得分:1)

要添加到Roadmaster的答案上,我遇到了类似的挑战:正常的Rails时间戳是根据数据库中的UTC存储的,但是我需要根据本地查询今天创建的所有记录时区。

查询如下所示:

completions.where("created_at BETWEEN ? AND ?", 
  Date.today, Date.today + 1.day).count >= 1

我通过在日期调用#to_time来解决此问题,如下所示。这将它们转换为具有适当时区的时间戳,并在数据库中获取正确的记录,从而有效地使查询时区感知。

completions.where("created_at BETWEEN ? AND ?", 
  Date.today.to_time, Date.today.to_time + 1.day).count >= 1

答案 2 :(得分:0)

只需要取消注释并更改为您想要的时区。

如果要检查所有时区,请运行rake time:zones:all并输出一个列表。

config/Application.rb

module Clerk
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
    # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
    config.time_zone = 'La Paz'

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    # config.i18n.default_locale = :de
  end
end

答案 3 :(得分:0)

我在代码行中添加了以下内容。我希望 created_at ActiveRecord 数据创建中。

config/Application.rb

module RailsApp
  class Application < Rails::Application

    config.time_zone = 'Pacific Time (US & Canada)'
    config.active_record.default_timezone = 'Pacific Time (US & Canada)'


  end
end