2010-03-25 16 views
9

Sitem, heroku üzerinde konuşlandırıldı. Time.now bugün dönecek, ancak bir kaydın created_at alanı (şu an oluşturuldu) yarın diyecek. Bunun sunucu zamanı ile alakası var mı?Time.now & Created_at farklı mıdır? Ruby on Rails

Aynı olduklarından emin olmanın bir yolu var mı? iyisi, Elliot


Güncelleme bunu Öyle "Heroku tırmık süresi: bölgeler: us"

o bana verdi:

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

, ben config.time_zone ayarladığınızda = Ortamımda 'UTC -05: 00', uygulama başlamıyor. herhangi bir fikir?

+0

Sen o UTC -05 için isimler olarak saat dilimini ayarlamak için 'Doğu Saati (ABD & Kanada)' ya da 'Indiana (Doğu)' ya kullanmanız gerekir: 00. Ayrıca, config.time_zone ayarlandığında Time.now yerine Time.current öğesini çağırmak en iyisidir. – Corey

+1

Merhaba: Saat dilimlerinin adları, UTOW özelliklerinin AŞAĞIDAKİ şeklindedir. Örneğin, kullanın: config.time_zone = 'Indiana (Doğu)' Corey'in dediği gibi, Time.current (veya Time.zone.now) kullanılarak yapılandırdığınız saat dilimi için ayarlanmış bir zaman değeri elde edilir.Genelde, alıştığınız Zaman için herhangi bir yöntemi kullanabilirsiniz, ancak bunları saat diliminizi dikkate alan Time.zone'da aramalısınız. Bu elbette raylarla ilgili; ActiveSupport olmadan düz Ruby'de çalışmaz. – Roadmaster

cevap

16

Raylar daima UTC zamanını veritabanında saklar; created_at alanının kendi başına UTC'ye göre tam olarak saat diliminizin varyasyonuyla dengelenmesi gerekir.

Uygulamanızda bir kayıt yüklediğinizde, alanlar environment.rb dosyasında belirtilen zaman dilime dönüştürülür. Böyle bir şey olabilir:

config.time_zone = 'UTC' 

zaman diliminize düzgün dönüştürülecek için, bu yapılandırma gerçek zaman dilimini eşleşen birine ayarını değişebilir. Örneğin:

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

mevcut dilimlerini görmek için konuya da raylar dizinde "-D zaman komisyon". Bu, yapılandırmada kullanmak için saat dilimi isimlerinin nasıl alınacağı konusunda size talimatlar verecektir.

+0

Merhaba Roadmaster, cevabınız için teşekkürler, denedim ve güncellenmiş – Elliot

+0

hatasını aldım. Bunu uygulamada yapmanız gerekeceğine inanıyorum.rb environment.rb – marimaf

1

Roadmaster'ın yanıtına eklemek için, benzer bir zorluk yaşadım: normal Rails zaman damgaları veritabanındaki UTC'ye göre depolandı, ancak yerel saat dilimine göre bugün oluşturulmuş tüm kayıtları bulmak için sorgulamam gerekiyordu.

sorgu

bu benziyordu şu şekildedir:
completions.where("created_at BETWEEN ? AND ?", 
    Date.today, Date.today + 1.day).count >= 1 

Ben tarihlerde #to_time arayarak bu sabit. Bu, bunları uygun saat dilimine sahip bir zaman damgasına dönüştürdü ve veritabanında doğru kayıtları sorgulandı ve sorgu saat dilimini farkında hale getirdi.

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

Arzu etmeniz gereken zaman dilimini değiştirmeniz yeterli.

Tüm saat dilimini kontrol etmek isterseniz, rake time:zones:all'u çalıştırın ve bir liste çıktısını alın.

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