我的网站部署在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'时,应用程序无法启动。任何想法?
答案 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