Time.now и Created_at отличаются? Рубин на рельсах - PullRequest
11 голосов
/ 25 марта 2010

Мой сайт развернут на героку. Time.now вернется сегодня, но поле create_at записи (созданной прямо сейчас) сообщит о своем завтрашнем дне. Я полагаю, это связано с временем сервера?

Есть ли способ убедиться, что они одинаковые? Лучший, Эллиот


Обновление, поэтому я сделал это "Герои рейка времени: зоны: нас"

это дало мне:

    * 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 ]

16 голосов
/ 25 марта 2010

Rails всегда хранит время UTC в базе данных; само поле create_at должно быть смещено точно на изменение вашего часового пояса относительно UTC.

Каждый раз, когда вы загружаете запись в свое приложение, поля конвертируются в часовой пояс, указанный в environment.rb. Это может выглядеть примерно так:

config.time_zone = 'UTC'

Для правильного преобразования времени в ваш часовой пояс вы можете изменить этот параметр конфигурации на тот, который соответствует вашему фактическому часовому поясу. Например:

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

Чтобы увидеть доступные зоны, введите "rake -D time" в вашем каталоге rails. Это даст вам инструкции о том, как получить имена часовых поясов для использования в конфигурации.

1 голос
/ 18 февраля 2014

Чтобы добавить ответ Roadmaster, у меня была похожая проблема: обычные временные метки Rails хранились в базе данных на основе UTC, но мне нужно было запросить, чтобы найти все записи, созданные сегодня в соответствии с местным временем.zone.

Запрос выглядел так:

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
0 голосов
/ 16 февраля 2019

Я добавил следующее к строкам кода. Я хотел, чтобы create_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
0 голосов
/ 27 октября 2014

Просто нужно раскомментировать и изменить часовой пояс, который вы хотите.

Если вы хотите проверить все часовые пояса, запустите 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...