2010-03-25 11 views
9

Mi sitio está implementado en heroku. Time.now volverá hoy, pero el campo created_at de un registro (creado en este momento) dirá su mañana. Supongo que esto tiene que ver con el tiempo del servidor?Time.now y Created_at son diferentes? Ruby on Rails

¿Hay alguna manera de asegurarse de que sean iguales? Mejor , Elliot


actualización así que hice este "tiempo rastrillo heroku: zonas: nosotros"

que me dio:

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

sin embargo, cuando me puse config.time_zone = 'UTC -05: 00' en mi entorno, la aplicación no puede iniciarse. ¿algunas ideas?

+0

Deberá usar "Hora del Este (EE. UU. Y Canadá)" o "Indiana (Este)" para establecer la zona horaria ya que esos son los nombres de UTC -05: 00. Además, es mejor llamar a Time.current en lugar de Time.now cuando se configuró config.time_zone. – Corey

+1

Hola: Los nombres de las zonas horarias son los que aparecen A CONTINUACIÓN de las especificaciones UTC. Por ejemplo, use: config.time_zone = 'Indiana (Este)' Como dice Corey, usar Time.current (o Time.zone.now) arrojará un tiempo ajustado para la zona horaria que configuró.En general, puede usar cualquiera de los métodos de Tiempo a los que está acostumbrado, pero debe llamarlos en Time.zone, que tiene en cuenta su zona horaria. Esto, por supuesto, está relacionado con los rieles; no funcionará en Ruby simple sin ActiveSupport. – Roadmaster

Respuesta

16

Rails siempre almacena la hora UTC en la base de datos; el campo created_at en sí mismo debe compensarse exactamente con la variación de la zona horaria relativa a UTC.

Cada vez que carga un registro en su aplicación, los campos se convierten a la zona horaria especificada en environment.rb. Podría tener algo como esto:

config.time_zone = 'UTC' 

Para el tiempo para ser convertido correctamente a su zona horaria, es posible cambiar la configuración de esta configuración a uno que coincida con su zona horaria actual. Por ejemplo:

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

Para ver las zonas disponibles, emita "rake -D time" en el directorio de sus raíles. Esto le dará instrucciones sobre cómo obtener nombres de zona horaria para usar en la configuración.

+0

Hola Roadmaster, gracias por la respuesta, lo probé y recibí el error actualizado – Elliot

+0

Creo que necesita hacer esto en la aplicación.rb no en el entorno.rb – marimaf

1

Para agregar a la respuesta de Roadmaster, tuve un desafío similar: las marcas de tiempo Rails normales se almacenaban en UTC en la base de datos, pero necesitaba buscar para todos los registros creados hoy de acuerdo con la zona horaria local.

La consulta era la siguiente:

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

i fijo esto llamando #to_time de las fechas, de la siguiente manera. Esto los convirtió en una marca de tiempo con el huso horario apropiado, y los registros correctos se obtuvieron en la base de datos, lo que hace que la consulta tenga en cuenta la zona horaria.

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

Solo necesita descomentar y cambiar a la zona horaria que desee.

Si desea verificar todas las zonas horarias, ejecute rake time:zones:all y obtendrá una lista.

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