2009-12-20 7 views
28

¿Es Time.zone.now.to_date equivalente a Date.today?¿Es Time.zone.now.to_date equivalente a Date.today?

Otra forma de decirlo: Time.zone.now.to_date == Date.today siempre será true?

De no ser así, ¿cuál es la mejor manera de obtener un objeto de fecha correspondiente a "ahora" en la zona horaria de la aplicación?

+0

Esta es una gran referencia para las fechas y horas para evitar trampas de zona horaria: http: //danilenko.org/2012/7/6/rails_timezones/ – Matt

+0

La forma correcta es la siguiente: http://stackoverflow.com/a/27397193/115363 –

Respuesta

39

No son siempre lo mismo. Time.zone.now.to_date usará la zona horaria de las aplicaciones, mientras que Date.today usará la zona horaria de los servidores. Entonces, si los dos mienten en fechas diferentes, entonces serán diferentes. Un ejemplo de mi consola:

ruby-1.9.2-p290 :036 > Time.zone = "Sydney" 
=> "Sydney" 
ruby-1.9.2-p290 :037 > Time.zone.now.to_date 
=> Wed, 21 Sep 2011 
ruby-1.9.2-p290 :038 > Date.today 
=> Tue, 20 Sep 2011 
+0

Tenga cuidado con este problema: http://stackoverflow.com/a/27397193/115363 –

9

Aún más fácil: Time.zone.today

También escribió un pequeño método de ayuda Date.today_in_zone que hace que sea muy fácil conseguir un "hoy" Date para una zona horaria específica sin tener que cambioTime.zone:

# Defaults to using Time.zone 
> Date.today_in_zone 
=> Fri, 26 Oct 2012 

# Or specify a zone to use 
> Date.today_in_zone('Sydney') 
=> Sat, 27 Oct 2012 

Para usarlo, sólo tirar esto en un archivo como 'lib/date_extensions.rb' y require 'date_extensions'.

class Date 
    def self.today_in_zone(zone = ::Time.zone) 
    ::Time.find_zone!(zone).today 
    end 
end 
2

creo que la mejor manera de aprender es la hora actual a través de:

Time.current 

Esto comprobará automáticamente para ver si se ha establecido la zona horaria entonces se llamará Time.zone.now, pero si no lo harás, solo llamarás a Time.now.

Además, no se olvide de establecer su zona horaria en application.rb

Cuestiones relacionadas