2009-06-14 31 views
30

Supongamos que tengo una fecha estándar Post.first.created_at. ¿Puedo comparo directamente con una fecha y hora en el formato 2009-06-03 16:57:45.608000 -04:00 haciendo algo como:Comparación de fechas en raíles

Post.first.created_at > Time.parse("2009-06-03 16:57:45.608000 -04:00") 

Editar: Ambos campos son datetimes, no las fechas.

Respuesta

41

Sí, puede utilizar los operadores de comparación para comparar fechas ej .:

irb(main):018:0> yesterday = Date.new(2009,6,13) 
=> #<Date: 4909991/2,0,2299161> 
irb(main):019:0> Date.today > yesterday 
=> true 

Pero, ¿está tratando de comparar una fecha para una fecha y hora?

Si ese es el caso, querrá convertir la fecha y hora en una fecha y luego hacer la comparación.

Espero que esto ayude.

+3

Solo una nota: la comparación de los propios objetos Datetime de los raíles con otros puede dar resultados muy inesperados. Notablemente ... ver a continuación: 'p.created_at # Vie, 28 Ago 2015 21:45:14 UTC +00: 00' 'p.updated_at # Vie, 28 Ago de 2015 21:45:14 UTC +00: 00 ' ' p.created_at == p.updated_at # false' Así que tienes que hacer esto ... 'p.created_at.to_i == p.updated_at.to_i # true' más información aquí: http: // stackoverflow .com/questions/19599792/comparing-identical-datetime-objects-in-ruby-why-are-these-two-datetime-nows – bwest87

9

Sí, puede comparar directamente el valor de un campo de fecha/hora created_at ActiveRecord con un objeto normal DateTime (como el que puede obtener para analizar la cadena que tiene).

En un proyecto que tengo un objeto de valor que tiene un objeto created_at de fecha y hora:

imac:trunk luca$ script/console 
Loading development environment (Rails 2.3.2) 
>> Value.first.created_at 
=> Fri, 12 Jun 2009 08:00:45 CEST 02:00 
>> Time.parse("2009-06-03 16:57:45.608000 -04:00") 
=> Wed Jun 03 22:57:45 0200 2009 
>> Value.first.created_at > Time.parse("2009-06-03 16:57:45.608000 -04:00") 
=> true 

El campo created_at se define como:

create_table "values", :force => true do |t| 
    [...] 
    t.datetime "created_at" 
    end 

N. B. si el campo es una fecha y no una fecha y hora, entonces usted necesita para convertirlo en un tiempo:

Post.first.created_at.to_time > Time.parse("2009-06-03 16:57:45.608000 -04:00") 

o analizar una fecha:

Post.first.created_at > Date.parse("2009-06-03 16:57:45.608000 -04:00") 

de lo contrario obtendrá un:

ArgumentError: comparison of Date with Time failed