2009-06-14 48 views
30

Giả sử tôi có ngày giờ chuẩn Post.first.created_at. Tôi có thể so sánh trực tiếp với một datetime trong các định dạng 2009-06-03 16:57:45.608000 -04:00 bằng cách làm một cái gì đó như:So sánh ngày trong đường ray

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

Edit: Cả hai lĩnh vực là datetimes, không ngày.

Trả lời

41

Có, bạn có thể sử dụng toán tử so sánh để so sánh ngày ví dụ .:

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

Nhưng bạn đang cố gắng để so sánh một ngày đến một datetime?

Nếu trường hợp đó xảy ra, bạn sẽ muốn chuyển đổi ngày giờ thành ngày sau đó thực hiện so sánh.

Tôi hy vọng điều này sẽ hữu ích.

+3

Chỉ cần lưu ý: So sánh các đường ray của đối tượng datetime riêng với những đối tượng khác có thể cho kết quả rất bất ngờ. Đáng chú ý ... xem bên dưới: 'p.created_at # Thứ Sáu, 28 Tháng 8 2015 21:45:14 UTC: 00' ' p.updated_at # Fri, 28 Aug 2015 21:45:14 UTC cho: 00 ' ' p.created_at == p.updated_at # false' Vì vậy, bạn phải làm điều này ... 'p.created_at.to_i == p.updated_at.to_i # true' thông tin thêm tại đây: http: // stackoverflow .com/questions/19599792/compare-same-datetime-objects-in-ruby-why-are-these-two-datetime-nows – bwest87

9

Có, bạn có thể so sánh trực tiếp giá trị của trường created_at Ngày/giờ ActiveRecord với đối tượng DateTime thông thường (giống như đối tượng bạn có thể phân tích cú pháp chuỗi bạn có).

Trong một dự án tôi có một đối tượng giá trị gia tăng mà có một đối tượng created_at datetime:

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 

Trường created_at được định nghĩa là:

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

N.B. nếu trường của bạn là một ngày và không phải là một datetime, thì bạn cần phải chuyển nó sang một thời điểm:

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

hoặc phân tích một ngày:

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

nếu không bạn sẽ nhận được một:

ArgumentError: comparison of Date with Time failed