2012-10-05 24 views
10

En Rails, estoy un poco confundido sobre la orientación entre cuándo utilizar DateTime.now.utc y Time.current. Parece haber diferentes opiniones dentro del marco sobre cuál es la mejor, particularmente en diferentes versiones.¿Cuándo se debería usar `DateTime.now.utc` contra` Time.current.utc` en Rails?

Parece que DateTime.now.utc produce una marca de tiempo con un desplazamiento de ceroGMT, mientras que Time.current.utc produce una marca de tiempo con una zona momento de UTC. Parece una distinción sutil, pero es bastante importante en muchos casos (por ejemplo, cálculos de horario de verano).

¿Cuándo debe usar DateTime.now.utc y cuándo debe usar Time.current.utc? ¿Hay alguna razón para usar DateTime.now.utc en lugar de Time.current.utc?

+0

¿Puede dar un ejemplo de dónde hace la diferencia? Dado que UTC no tiene ninguna transición de horario de verano, seguramente solo hace una diferencia cuando empiezas a usar otras zonas horarias ... (No conozco a Ruby, pero he hecho bastante cosas de fecha y hora, así que con más antecedentes puedo ayudar.) –

+0

@JonSkeet: No sé si hace la diferencia. (¡Es por eso que estoy preguntando cuál debería estar usando!) 'DateTime.now.utc' primero invoca' DateTime.now', y luego invierte el desplazamiento UTC para obtener el tiempo "UTC". Así que ten en cuenta que no se traduce entre _time zones_, sino entre _offsets_. ¿Podría ser problemático en casos extremos, por ejemplo, el infame ejemplo de 1927-1928 en Shanghai? –

+0

@JonSkeet: a menos que esté realmente en UTC, entonces 'DateTime.now' y 'Time.current' producen una hora local en algo distinto de UTC. En otras palabras, parecen diferir en sus enfoques sobre cómo se convierten a UTC; uno lo hace aplicando un desplazamiento de manera directa; el otro lo hace rehaciendo los cálculos de zona horaria en la nueva zona horaria de UTC. –

Respuesta

30

Creo que debería usar .current en lugar de .now.

La diferencia de .current y .now es .now utilizan la zona horaria del servidor, mientras que el uso .current entorno de lo que los rieles se establece en. Si no está configurado, entonces .current será el mismo que .now.

Time.current

devoluciones Time.zone.now cuando se establecen Time.zone o config.time_zone, de lo contrario sólo devuelve Time.now.

Datetime.current

devoluciones Time.zone.now.to_datetime cuando se establecen Time.zone o config.time_zone , de lo contrario devuelve tiempo. now.to_datetime.

+0

¿Qué tal Date.current y Date.today son los mismos? – ajahongir

+0

¿Cuál es la diferencia entre 'Time.now.in_time_zone' y' Time.current'? –

+0

@pinouchon Son lo mismo, ambas instancias de devolución de 'ActiveSupport :: TimeWithZone'. – xdazz

Cuestiones relacionadas