2012-01-05 22 views
9

tôi có mô hình và phương pháp sau đây:Tại sao Date.yfter được tính là Date.today?

class UserPrice < ActiveRecord::Base 
    attr_accessible :price, :purchase_date,  

    def self.today 
    where(:purchase_date => Date.today) 
    end 

    def self.yesterday 
    where(:purchase_date => Date.yesterday) 
    end 

Tại sao vào mẫu của tôi nếu tôi cung cấp cho lĩnh vực date_select tôi :purchase_date 1/4/2012 (yesterday phương pháp) nó cũng đếm như hiện nay (today phương pháp) và nếu tôi cung cấp cho nó 1/5/2012 (hôm nay) nó là nil?

P.S. Tôi đang sử dụng Rails 3.0.10 với PostgreSQL.


Cập nhật

Đây là giao diện điều khiển lợi nhuận của tôi:

$ rails console --s 
Loading development environment in sandbox (Rails 3.0.10) 
Any modifications you make will be rolled back on exit 
irb(main):001:0> Date.today 
=> Wed, 04 Jan 2012 
irb(main):002:0> Time.now 
=> 2012-01-04 21:28:07 -0500 
irb(main):003:0> Time.zone.now 
=> Thu, 05 Jan 2012 02:28:18 UTC +00:00 
irb(main):004:0> Date.yesterday 
=> Wed, 04 Jan 2012 
irb(main):005:0> 

Bây giờ yesterday là hơi say lên, làm cho không có ý nghĩa ....

+1

Câu trả lời cho [câu hỏi này] (http://stackoverflow.com/questions/2944018/rails- 3-timezone-error) có thể hữu ích. – holygeek

+0

@holygeek Điểm tốt, tôi đã xem trong giao diện điều khiển nó nó trả lại vấn đề của tôi. – LearningRoR

Trả lời

10

này đang xảy ra vì tính toán. rb đang gọi phương thức "hiện tại" của lớp Date cho múi giờ được cấu hình (Mặc định là UTC).

Nếu bạn mở các đường ray giao diện điều khiển, bạn có thể xem ngày mà "Date.yesterday" được tính toán trên bằng cách thực hiện:

Time.zone.today 

Điều này có lẽ sẽ cho bạn thấy ngày mai. Vì vậy, ngày hôm qua cho những gì đường ray nhìn thấy như ngày hôm nay, là ngày hôm nay. ;)

Bạn có thể làm việc với các thư viện ngày trực tiếp hơn bằng cách thực hiện:

Date.today.advance(:days => -1) 

này sẽ cung cấp cho bạn ngày hôm qua giống như bạn mong đợi trong khi active_support đang trở lại:

Date.current.advance(:days => -1) 
+0

Cảm ơn bạn, tôi đánh giá cao nó. – LearningRoR

+0

Dễ đọc hơn là sử dụng '1.day.ago', cho bạn ngày hôm qua như bạn mong đợi. – Jiemurat

0

Nếu bạn sử dụng Time lớp học, bạn sẽ có quyền truy cập vào múi giờ UTC (hoặc "zulu") thay vì sử dụng múi giờ của môi trường trong lớp học Date.

class UserPrice < ActiveRecord::Base 
    attr_accessible :price, :purchase_date,  

    def self.today 
    where(purchase_date: today_utc_date) 
    end 

    def self.yesterday 
    where(purchase_date: today_utc_date.yesterday) 
    end 

    private 

    def today_utc_date 
    @today ||= Time.zone.today 
    end 
end 

Ngoài ra, nếu bạn cần phải xử lý một ngày bên ngoài, ví dụ params[:purchase_date]:

Time.parse(params[:purchase_date]).utc.to_date 
Các vấn đề liên quan