2009-06-14 7 views
30

Supponiamo di avere un datetime standard Post.first.created_at. Posso confrontare che direttamente con un datetime nel formato 2009-06-03 16:57:45.608000 -04:00 facendo qualcosa di simile:Confronto delle date nei binari

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

Edit: Entrambi i campi sono datetimes, non date.

risposta

41

Sì, è possibile utilizzare gli operatori di confronto per confrontare le date per es .:

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

Ma stai cercando di confrontare una data per un datetime?

Se questo è il caso, ti consigliamo di convertire il datetime in una data quindi effettuare il confronto.

Spero che questo aiuti.

+3

Solo una nota: confrontare i binari degli oggetti datetime con gli altri può dare risultati molto inaspettati. In particolare ... vedi sotto: 'p.created_at # Ven, 28 Ago 2015 21:45:14 UTC +00: 00' ' p.updated_at # Ven, 28 Ago 2015 21:45:14 UTC +00: 00 ' ' p.created_at == p.updated_at # false' Quindi devi fare questo ... 'p.created_at.to_i == p.updated_at.to_i # true' maggiori informazioni qui: http: // stackoverflow .com/domande/19599792/confrontando-identico-datetime-oggetti-in-ruby-perché-sono-i-due-datetime-nows – bwest87

9

Sì, è possibile confrontare direttamente il valore di un campo data/ora ActiveRecord created_at con un oggetto regolare DateTime (come quello che è possibile ottenere analizzando la stringa che si possiede).

In un progetto ho un oggetto valore che ha un oggetto datetime created_at:

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 

Il campo created_at è definito come:

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

N.B. se il campo è una data e non un datetime, allora avete bisogno di convertirlo in un tempo:

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

o di analizzare una data:

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

altrimenti si otterrà una:

ArgumentError: comparison of Date with Time failed