2009-06-14 10 views
30

Angenommen, ich habe einen Standard Post.first.created_at datetime. Kann ich das direkt mit einem Datetime im Format 2009-06-03 16:57:45.608000 -04:00 durch so etwas wie tun vergleichen:Vergleichen von Daten in Schienen

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

Edit: Beide Felder sind Datetimes, nicht Daten.

Antwort

41

Ja, können Sie Vergleichsoperatoren verwenden, um Termine zu vergleichen, z.B .:

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

Aber versuchen Sie, ein Datum zu einem Datumzeit zu vergleichen?

Wenn dies der Fall ist, sollten Sie die Datetime in ein Datum konvertieren und dann den Vergleich durchführen.

Ich hoffe, das hilft.

+3

Nur ein Hinweis: Vergleichen Rails eigene Datetime Objekte gegen andere kann sehr unerwartete Ergebnisse liefern. Bemerkenswert ... siehe unten: 'p.created_at # Fr, 28 Aug 2015 21:45:14 UTC +00: 00' ' p.updated_at # Fr, 28 Aug 2015 21:45:14 UTC +00: 00 ' ' p.created_at == p.updated_at # false' Also müssen Sie dies tun ... 'p.created_at.to_i == p.updated_at.to_i # true' mehr Infos hier: http: // stackoverflow com/questions/19599792/comparing-identic-datetime-Objekte-in-ruby-why-sind-diese-zwei-datetime-nows – bwest87

9

Ja, Sie können direkt den Wert eines created_at ActiveRecord Datum/Uhrzeit-Felds mit einem regulären DateTime Objekt vergleichen (wie das, das Sie erhalten können, wenn Sie die Zeichenfolge parsen).

In einem Projekt, das ich ein Wertobjekt habe, die ein created_at Datetime-Objekt hat:

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 

Das created_at Feld ist definiert als:

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

N. B. wenn Ihr Feld ein Datum und kein Datetime ist, dann müssen Sie es zu einem Zeitpunkt, konvertieren:

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

oder ein Datum analysieren:

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

sonst werden erhalten Sie ein:

ArgumentError: comparison of Date with Time failed