ฉันจะนับจำนวนวันระหว่างวันที่ทั้งสองนี้ได้อย่างไร
start_date = Date.parse "2012-03-02 14:46:21 +0100"
end_date = Date.parse "2012-04-02 14:46:21 +0200"
ฉันจะนับจำนวนวันระหว่างวันที่ทั้งสองนี้ได้อย่างไร
start_date = Date.parse "2012-03-02 14:46:21 +0100"
end_date = Date.parse "2012-04-02 14:46:21 +0200"
คำตอบ:
ด้วยคลาส Date (และ DateTime) คุณสามารถทำได้(end_date - start_date).to_i
เพื่อให้ได้จำนวนวันที่แตกต่างกัน
Time
วัตถุส่งคืนวินาทีแม้ว่า
Time
วัตถุอย่างผิดพลาดไม่ใช่Date
วัตถุ บางทีคุณสามารถอัปเดตการตั้งชื่อในความคิดเห็นของคุณเพื่อแสดงว่าพวกเขาไม่ใช่วันที่?
สมมติว่าend_date
และstart_date
มีทั้งของชั้นActiveSupport::TimeWithZone
ใน Rails แล้วคุณสามารถใช้:
(end_date.to_date - start_date.to_date).to_i
(Time.zone.now.to_date - 23.hours.ago.to_date).to_i
มันให้ 1 และควรเป็น 0
Time.zone.now.to_date
ส่งคืน "Wed, 15 Nov 2017" ในขณะที่23.hours.ago.to_date
ส่งคืน "Tue, 14 Nov 2017" ความแตกต่างของจำนวนวันคือและควรเป็น 1 ยกเว้นว่าคุณใช้รหัสในชั่วโมงก่อนเที่ยงคืน
Rails มีผู้ช่วยในตัวที่อาจช่วยคุณได้ สิ่งหนึ่งที่ต้องจำไว้คือนี่เป็นส่วนหนึ่งของ Helpview ของ Actionview ดังนั้นจึงไม่สามารถใช้งานได้โดยตรงจากคอนโซล
ลองสิ่งนี้
<% 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"
ฉันได้รับผลลัพธ์ในไม่กี่วินาทีดังนั้นนี่จึงใช้ได้สำหรับฉัน:
(Time.now - self.created_at) / 86400
1.day
ไม่ruby
เป็นที่ต้องการ OP (ในแท็ก) มันมีRails
ความเฉพาะเจาะจงมากกว่าหรือactive support
ว่าcreated_at
เป็นModel
วิธีในการRails
..
เพื่อรับจำนวนวันในช่วงเวลา (เพียงนับจำนวนวันทั้งหมด)
(start_date..end_date).count
(start_date..end_date).to_a.size
#=> 32
เพื่อรับจำนวนวันระหว่าง 2 วัน
(start_date...end_date).count
(start_date...end_date).to_a.size
#=> 31
ไม่มีคำตอบก่อนหน้า (จนถึงวันนี้) ที่ให้ความแตกต่างที่ถูกต้องเป็นวันระหว่างวันที่สองวัน
หนึ่งที่อยู่ใกล้ที่สุดคือมาโดยthatdankent คำตอบแบบเต็มจะแปลงto_i
แล้วหาร:
(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
ในตัวอย่างที่เฉพาะเจาะจงของคำถามเราไม่ควรแยกวิเคราะห์Date
ว่าเวลาที่ผ่านไปนั้นเกี่ยวข้องกันหรือไม่ ใช้Time.parse
แทน
วิธีมีจำนวนวันทั้งวันระหว่างสองวัน ( DateTime
วัตถุ):
((end_at - start_at).to_f / 1.day).floor
วิธีรับจำนวนวันแตกต่างกันตามวันที่สองวัน:
(start.to_date...end.to_date).count - 1
or
(end.to_date - start.to_date).to_i
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