Ok những gì về điều này:
def age
return unless dob
t = Date.today
age = t.year - dob.year
b4bday = t.strftime('%m%d') < dob.strftime('%m%d')
age - (b4bday ? 1 : 0)
end
Điều này giả sử chúng ta đang sử dụng đường ray, gọi agephương thức trên một mô hình và mô hình có một cột cơ sở dữ liệu ngày dob. Điều này khác với các câu trả lời khác vì phương pháp này sử dụng các chuỗi để xác định xem chúng tôi có trước sinh nhật năm nay không.
Ví dụ: nếu doblà 2004/2/28 và todaylà 2014/2/28, agesẽ là 2014 - 2004hoặc 10. Những chiếc phao sẽ 0228và 0229. b4bdaysẽ "0228" < "0229"hoặc true. Cuối cùng, chúng tôi sẽ trừ 1từ agevà nhận được 9.
Đây sẽ là cách bình thường để so sánh hai lần.
def age
return unless dob
t = Date.today
age = today.year - dob.year
b4bday = Date.new(2016, t.month, t.day) < Date.new(2016, dob.month, dob.day)
age - (b4bday ? 1 : 0)
end
Điều này hoạt động như nhau, nhưng b4bdaydòng quá dài. Các 2016năm cũng là không cần thiết. Việc so sánh chuỗi ở đầu là kết quả.
Bạn cũng có thể làm điều này
Date::DATE_FORMATS[:md] = '%m%d'
def age
return unless dob
t = Date.today
age = t.year - dob.year
b4bday = t.to_s(:md) < dob.to_s(:md)
age - (b4bday ? 1 : 0)
end
Nếu bạn không sử dụng đường ray, hãy thử điều này
def age(dob)
t = Time.now
age = t.year - dob.year
b4bday = t.strftime('%m%d') < dob.strftime('%m%d')
age - (b4bday ? 1 : 0)
end
👍🏼