2010-06-16 32 views
34

Tôi có cảm giác ai đó sẽ chỉ cho tôi một câu hỏi khác trả lời câu hỏi này nhưng tôi đã tìm kiếm không may mắn về vấn đề đơn giản này.Tính toán sự khác biệt trong những ngày ActiveSupport: TimeWithZone theo kiểu "rubyish" nhất?

Tôi có một Activerecord với thuộc tính datetime. Nó trả về dưới dạng ActiveSupport: TimeWithZone. Tôi biết tôi không thể so sánh điều đó với DateTime.now vì nó không bao gồm một vùng nên tôi cần sử dụng Time.zone. Có ý nghĩa.

Điều tôi đang phân vân là có cách "dọn dẹp" hơn để làm điều này hơn trừ đi và chia kết quả cho 86400?

Dưới đây là những gì tôi làm:

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i 

trình nhưng dường như bỏ rubyish và tôi cảm thấy như tôi là thiếu một cái gì đó. Tôi có nên đúc, so sánh hoặc chuyển đổi một số tuyến đường khác hoặc đây thực sự là cách điển hình để làm điều này trong đường ray? Đánh giá cao bất kỳ mẹo hoặc liên kết nào đến câu hỏi đã đề cập đến điều này.

Cảm ơn bạn

+0

Bạn có muốn chữ đầu ra khi tất cả được nói và làm gì? – theIV

+0

Tôi bị giới hạn làm điều này trong một mô hình tại momemnt vì vậy tôi không thể tận dụng lợi thế của người giúp đỡ time_ago_in_words. Tôi chỉ lấy giá trị int trở lại ứng dụng khách. Cảm ơn các ý kiến ​​phản hồi tất cả mọi người. – Nick

Trả lời

73

Một điều bạn có thể làm để làm cho nó dễ đọc hơn là:

((Time.zone.now - myActiveRecord.visit_date)/1.day).to_i 

Edit:

Trên thực tế bạn có thể thoát khỏi một bộ khung với:

(Time.zone.now - myActiveRecord.visit_date).to_i/1.day 
+0

Thực sự là một phương pháp cho điều này mà tôi đề cập dưới đây. – jamesconant

+0

'' (Time.zone.now - 3.days.ago) .to_i/1.day'' sẽ xuất ra '' 2'' – dgilperez

+1

Điều này không phải lúc nào cũng hoạt động. Tôi phải làm thay vào đó: '(myActiveRecord.end_date.to_datetime.to_i - Time.now.to_i)/1.day' –

14

Tôi biết câu hỏi này có một chút ngày nhưng tôi đã xem qua câu hỏi này trong khi Googling cho một câu hỏi tương tự vấn đề. Trong trường hợp của tôi, tôi cần phải biết sự khác biệt trong cả ngày với quy mô vĩ mô và vi mô.

Ví dụ: tôi cần mã của mình để có thể cho tôi biết rằng ngày 31 tháng 12 năm 2010 là 366 ngày trước ngày 1 tháng 1 năm 2012 và ngày 31 tháng 12 năm 2010 23:59 là 1 ngày nữa kể từ ngày 1 tháng 1 năm 2011 00: 00. Phương pháp trên hoạt động trong trường hợp cũ nhưng trong trường hợp của phương pháp sau, nó nói rằng chúng cách nhau 0 ngày.

Điều tôi đã làm là sử dụng lớp học Date của Ruby để thực hiện phép tính cho tôi. Sử dụng đoạn mã trên phương pháp của tôi trông như thế này:

(Time.zone.now.to_date - myActiveRecord.visit_date.to_date).to_i

này sẽ làm việc với các đầu vào trong Time hoặc DateTime do chuyển đổi. Một giải pháp khả thi khác là trước tiên hãy gọi beginning_of_day trên mỗi Times hoặc DateTimes nhưng trong trường hợp của tôi, số phút quan trọng.

-1

Đường ray thực sự có phương thức được tích hợp sẵn cho loại thứ này.

thanh toán #time_ago_in_words

Vì vậy, đối với trường hợp ban đầu ...

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i

vs

time_ago_in_words(myActiveRecord.visit_date)

+0

Thực ra phương thức đó trả về một mô tả chuỗi có thể đọc được của con người, chứ không phải là sự khác biệt số thực tế. –

+0

Rất tiếc, bắt tốt. – jamesconant

Các vấn đề liên quan