web-dev-qa-db-fra.com

Comparaison des dates en rails

Supposons que j'ai une norme Post.first.created_at datetime. Puis-je comparer cela directement avec un datetime au format 2009-06-03 16:57:45.608000 -04:00 en faisant quelque chose comme:

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

Edit: Les deux champs sont datetimes, pas les dates.

31
Tom Lehman

Oui, vous pouvez utiliser des opérateurs de comparaison pour comparer des dates, par exemple:

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

Mais essayez-vous de comparer une date à une date/heure?

Si c'est le cas, vous voudrez convertir le datetime en une date puis faire la comparaison.

J'espère que ça aide.

44
bernie

Oui, vous pouvez comparer directement la valeur d'un created_at Champ de date/heure ActiveRecord avec un objet DateTime normal (comme celui que vous pouvez obtenir en analysant la chaîne que vous avez).

Dans un projet, j'ai un objet Value qui a un objet 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

Le champ created_at est défini comme:

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

N.B. si votre champ est une date et non une date/heure, vous devez le convertir en une heure:

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

ou analyser une date:

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

sinon vous obtiendrez un:

ArgumentError: comparison of Date with Time failed
10
LucaM