Câu trả lời:
Với các lớp Date (và DateTime), bạn có thể làm (end_date - start_date).to_i
để có được số ngày chênh lệch.
Time
đối tượng làm trở lại giây mặc dù.
Time
các đối tượng, không phải Date
các đối tượng. Có lẽ bạn có thể cập nhật cách đặt tên trong bình luận của bạn để phản ánh rằng họ không phải là ngày?
Giả sử rằng end_date
và start_date
cả hai lớp ActiveSupport::TimeWithZone
trong Rails, thì bạn có thể sử dụng:
(end_date.to_date - start_date.to_date).to_i
(Time.zone.now.to_date - 23.hours.ago.to_date).to_i
, nó cho 1 và nên là 0
Time.zone.now.to_date
trả về "Thứ tư, ngày 15 tháng 11 năm 2017", trong khi 23.hours.ago.to_date
trả về "Thứ ba, ngày 14 tháng 11 năm 2017". Sự khác biệt về số ngày là và nên là 1 trừ khi bạn chạy mã của mình trong giờ trước nửa đêm.
Rails có một số trợ giúp tích hợp có thể giải quyết điều này cho bạn. Một điều cần lưu ý là đây là một phần của Actionview Helpers, vì vậy chúng sẽ không có sẵn trực tiếp từ bảng điều khiển.
Thử cái này
<% start_time = "2012-03-02 14:46:21 +0100" %>
<% end_time = "2012-04-02 14:46:21 +0200" %>
<%= distance_of_time_in_words(start_time, end_time) %>
"about 1 month"
để có được số ngày trong một khoảng thời gian (chỉ là tổng số ngày)
(start_date..end_date).count
(start_date..end_date).to_a.size
#=> 32
để có được số ngày giữa 2 ngày
(start_date...end_date).count
(start_date...end_date).to_a.size
#=> 31
Không có câu trả lời nào trước đó (cho đến ngày nay) đưa ra sự khác biệt chính xác về số ngày giữa hai ngày.
Một trong những gần nhất là bởi đó . Một câu trả lời đầy đủ sẽ chuyển đổi to_i
và sau đó chia:
(Time.now.to_i - 23.hours.ago.to_i) / 86400
>> 0
(Time.now.to_i - 25.hours.ago.to_i) / 86400
>> 1
(Time.now.to_i - 1.day.ago.to_i) / 86400
>> 1
Trong ví dụ cụ thể của câu hỏi, người ta không nên phân tích Date
nếu thời gian trôi qua có liên quan. Sử dụng Time.parse
thay thế.
def business_days_between(date1, date2)
business_days = 0
date = date2
while date > date1
business_days = business_days + 1 unless date.saturday? or date.sunday?
date = date - 1.day
end
business_days
end