2012-05-10 23 views
9

En Rails, veo que tengo algunas opciones para analizar una fecha y una fecha. ¿Cuál es la mejor práctica para analizar las fechas con el único propósito de persistir en la base de datos a través de ActiveRecord? ¿Y por qué?¿Con qué debería siempre analizar las fechas? DateTime, Time, Time.zone?

Time.zone.parse(...) 
Time.parse(...) 
DateTime.parse(...) 
+0

también [esto] (http://stackoverflow.com/questions/9138515/when -should-i-use-datetime-vs-date-time-fields-in-ruby-rails) y [this] (http://stackoverflow.com/questions/1261329/whats-the-difference-between-datetime- and-time-in-ruby/1261435 # 1261435), que dice usar DateTime cuando se trata de Fechas o Fechas lejanas en el futuro. –

Respuesta

13

ir con Time.zone.parse si lo que desea escribir en ActiveRecord.

DateTime debe evitarse. Si está manejando fechas, debería usar Date.parse en su lugar.

Más allá de eso, depende de si la entrada viene con información de zona horaria, en qué está configurada la zona horaria actual y si desea zonas horarias en sus datos.

Time.zone.parse devolverá un ActiveSupport :: TimeWithZone, por defecto a UTC.

> Time.zone.parse("12:30") 
=> Thu, 10 May 2012 12:30:00 UTC +00:00 

Time.parse devolverá un tiempo, con una zona si se especifica en la entrada, o la TZ local.

> Time.parse("12:30") 
=> 2012-05-09 12:30:00 -0700 

Para una explicación más detallada de las comparaciones en el tiempo y la precisión de Ruby, lea esta entrada del blog:

http://blog.tddium.com/2011/08/07/rails-time-comparisons-devil-details-etc/

+1

Time.zone.parse "predeterminado" a UTC si su aplicación Rails está predeterminada en UTC (en environment.rb) ... Time.parse se establece de manera predeterminada en el desplazamiento de zona horaria local del servidor independientemente de la aplicación Rails. – Pavling

+0

Oye, 'Time.zone.parse' toma la zona predeterminada de los carriles correctamente, mientras DateTime devuelve UTC. entonces +1, pero ¿hay alguna otra razón para "DateTime debe evitarse"? –

1

Times que se establecen automáticamente por ActiveRecord (por ejemplo created_at y updated_at) volver como ActiveSupport::TimeWithZone casos.

De acuerdo con la documentación, ActiveSupport::TimeWithZone y Time tienen la misma API, por lo que Time es lo que usaría.

En una nota relacionada, hay métodos to_time y to_datetime los que puede llamar en cadenas:

"2012-05-09".to_time # => 2012-05-09 00:00:00 UTC 
"2012-05-09".to_datetime # => Wed, 09 May 2012 00:00:00 +0000 
Cuestiones relacionadas