2010-11-14 51 views
13

Tôi chỉ đang xem ruby ​​và đang chơi với ngày/giờ.Trừ ngày tháng với Ruby

irb(main):001:0> jamis_DOB = Time.mktime(2003, 10, 22, 06, 59) 
=> Wed Oct 22 06:59:00 +0300 2003 
irb(main):002:0> age = Time.now - jamis_DOB 
=> 222934108.172989 
irb(main):005:0> age_in_years = (((age/3600)/24)/365).to_i 
=> 7 

Vì vậy, ví dụ của tôi không tốt như age_in_years sẽ không biết nếu có năm nhuận như những năm đó cộng lại. Tôi đã trải qua một số hướng dẫn thời gian/ngày googled và đã không tìm thấy một cách dễ dàng để chỉ trừ hai ngày và có nó trở lại trong một năm, tháng, ngày vv ... định dạng. Tôi đoán ruby ​​có một tiện ích bổ sung hoặc một cái gì đó được tích hợp sẵn cho loại điều này. Ai đó có thể cho tôi biết đó là gì không? (Ngoài ra, bất kỳ lời khuyên nào về cách tìm câu trả lời cho loại điều này để tham khảo trong tương lai?)

Cảm ơn.

Trả lời

29

Bạn muốn Date thay vì Time:

require 'date' 

now = Date.today 
before = Date.civil(2000, 1, 1) 
difference_in_days = (now - before).to_i 

(difference_in_days/365.25).to_i 

Sẽ cung cấp cho bạn sự khác biệt trong những năm giữa hôm nay và ngày 01 tháng một năm 2000. Nó có lẽ có thể được cải thiện, tôi chỉ sử dụng số ngày trung bình mỗi năm (365,25), mà sẽ cung cấp cho bạn câu trả lời đúng, ngoại trừ trong trường hợp cực cạnh.

Bạn cũng có thể làm điều gì đó như thế này:

require 'date' 

years = 0 
d = Date.civil(2000, 1, 1) 
loop do 
    d = d.next_year 
    break if Date.today < d 
    years += 1 
end 

Nhưng Date#next_year đã được giới thiệu trong Ruby 1,9, vì vậy nó sẽ không làm việc trong 1.8.7.

Tất nhiên, cách dễ nhất để xác định số năm giữa hai ngày chỉ được trừ số:

2010 - 2000 # => 10 
+0

Nhờ Theo :) gợi ý thứ 3 của bạn cảm hứng cho tôi để làm ... require ' date' date_now = Date.today DOB = Date.civil (2003, 10, 22) nếu date_now.month> dob.month tuổi = date_now.year - dob.year elsif date_now.month == DOB .month && date_now.day> dob.daytuổi= date_now.year - dob.year khác tuổi = (date_now.year - dob.year) - 1 cuối cuối print "tuổi đúng là:", tuổi tác, "\ n" tôi thực sự không thể hiểu được gợi ý thứ hai của bạn và dường như không thể có 1,9 lượt chạy để chơi với nó. – Leke

+0

Vâng, bạn nói đúng, ví dụ cuối cùng cũng phải tính cả tháng và ngày vào tài khoản. Ví dụ ở giữa chỉ cần bước một năm cho mỗi lượt trong vòng lặp và đếm lượt. Tôi đã thay đổi nó chính xác hơn một chút. – Theo

+2

Tôi đã khá bối rối về lý do tại sao Ruby luôn trả về '/ 1' sau khi trừ ngày, điều quan trọng là phải thực hiện' to_i' trên kết quả như đã đề cập ở trên để lấy giá trị như một số ngày. – waffl

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