比较铁路的日期

Tom*_*man 31 datetime ruby-on-rails date-math

假设我有一个标准的Post.first.created_at日期时间.我可以2009-06-03 16:57:45.608000 -04:00通过执行以下操作直接将其与格式中的日期时间进行比较:

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

编辑:两个字段都是日期时间,而不是日期.

ber*_*nie 44

是的,您可以使用比较运算符来比较日期,例如:

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

但是你想把日期与日期时间进行比较吗?

如果是这种情况,您需要将日期时间转换为日期然后进行比较.

我希望这有帮助.

  • 只需注意:将rails自己的日期时间对象与其他对象进行比较可能会产生非常意外的结果.值得注意的是...请看下图:`p.created_at#周五,2015年8月28日21时45分14秒UTC +00:00``p.updated_at#周五,2015年8月28日21时45分14秒UTC +00:00`` p.created_at == p.updated_at #false.所以你必须这样做......`p.created_at.to_i == p.updated_at.to_i#true`更多信息:http://stackoverflow.com/questions/ 19599792 /比较-相同-日期时间的对象功能于红宝石为什么-是-这些-两日期时间-NOWS (4认同)

Luc*_*caM 10

是的,您可以直接比较created_atActiveRecord日期/时间字段的值与常规DateTime对象(就像您可以获得解析您拥有的字符串的那个).

在一个项目中,我有一个具有created_at datetime对象的Value对象:

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
Run Code Online (Sandbox Code Playgroud)

created_at字段定义为:

  create_table "values", :force => true do |t|
    [...]
    t.datetime "created_at"
  end
Run Code Online (Sandbox Code Playgroud)

注意如果您的字段是日期而不是日期时间,那么您需要将其转换为时间:

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

或解析日期:

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

否则你会得到一个:

ArgumentError: comparison of Date with Time failed
Run Code Online (Sandbox Code Playgroud)