दो तिथियों के बीच दिनों की संख्या की गणना करें


149

मैं इन दो तिथियों के बीच दिनों की संख्या कैसे गिनूं?

start_date = Date.parse "2012-03-02 14:46:21 +0100"
end_date =  Date.parse "2012-04-02 14:46:21 +0200"

जवाबों:


207

दिनांक (और दिनांक समय) कक्षाओं के साथ आप (end_date - start_date).to_iदिनों के अंतर की संख्या प्राप्त करने के लिए कर सकते हैं ।


5
@MichaelDurrant आप एक अनुचित धारणा बना रहे हैं। उपयोगकर्ता निर्दिष्ट नहीं करता है कि वे तार हैं या नहीं। वास्तव में जब से वे रेल का उपयोग कर रहे हैं, यह सबसे अधिक संभावना है कि तारीखें ActiveRecord से आ रही हैं जो स्वचालित रूप से उन्हें तारीख वस्तुओं में डाल देगा। दिया गया पाठ डेट ऑब्जेक्ट प्रतिनिधित्व के समान है, यह अत्यधिक संभावना है कि यह मूल स्रोत से आया है।
एंड्रयू फ्रांस

84
यह मुझे कुछ ही दिनों में अंतर नहीं
दिखाता है

6
जहां तक ​​मैं बता सकता हूं रूबी और एक्टिवसपोर्ट के सभी हाल के संस्करणों में व्यवहार समान है, क्रमशः 2.0 और 4.1.0 शामिल हैं। Timeवस्तुएं हालांकि सेकंड भर में वापसी करती हैं।
एंड्रयू फ्रांस

5
@ 2called-chaos उत्तर पर विस्तार करने के लिए, उन दिनों को प्राप्त करने के लिए जिनकी आपको आवश्यकता होगी (end_date - start_date) /1.day, जो आपको एक फ़्लोट देगा। यदि आप पूरे दिन चाहते थे तो आप केवल ((अंत_डी - start_date) / १.दिन) का उपयोग कर सकते हैं ।ceil
डेविड के।

2
@David को छोड़कर @ 2called-chaos द्वारा टिप्पणी गलती से Timeवस्तुओं का उल्लेख है , Dateवस्तुओं का नहीं । शायद आप अपनी टिप्पणी में नामकरण को अद्यतन करने के लिए यह दर्शा सकते हैं कि वे तिथियां नहीं हैं?
एंड्रयू फ्रांस

109

कि मान लिया जाये end_dateऔर start_dateवर्ग के दोनों कर रहे हैं ActiveSupport::TimeWithZoneरेल में है, तो आप उपयोग कर सकते हैं:

(end_date.to_date - start_date.to_date).to_i

2
यदि इसे टेबल फ़ील्ड्स के साथ करना है, तो यह उत्तर जाने का तरीका है; के बजाय यहाँ सबसे रेटेड एक।
बेन

के लिए काम नहीं करता है (Time.zone.now.to_date - 23.hours.ago.to_date).to_i, यह 1 देता है और 0 होना चाहिए
यूरी घनेश

3
@YuriGhensev, यह इस बात पर निर्भर करता है कि आप अपना उदाहरण कोड कब चलाते हैं, उदाहरण के लिए अभी Time.zone.now.to_date"Wed, 15 Nov 2017", जबकि 23.hours.ago.to_date"Tue, 14 Nov 2017" देता है। दिन की संख्या में अंतर 1 होना चाहिए और जब तक आप आधी रात से पहले अपने कोड को नहीं चलाते हैं।
ली

35

रेल में कुछ हेल्पर्स हैं जो आपके लिए इसे हल कर सकते हैं। एक बात का ध्यान रखें कि यह एक्शनव्यू हेल्पर्स का हिस्सा है, इसलिए वे कंसोल से सीधे उपलब्ध नहीं होंगे।

इसे इस्तेमाल करे

<% 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"

@MaayanNaveh ऐसा नहीं होना चाहिए जब आपको गणना के लिए वास्तविक संख्या की आवश्यकता हो।
फेडकॉम

यह सवाल उन मामलों में से एक है, जहां सवाल खुद ही बेहतर तरीके से पूछा जाता है। यदि आप अन्य उत्तरों का पालन करते हैं, तो आप उन मामलों में भाग लेंगे जहाँ आप कभी-कभी सप्ताह या वर्षों को दिनों के बजाय दिखाए जाते हैं। इसे वास्तव में "सही" रेल उत्तर के रूप में स्वीकार किया जाना चाहिए।
डायलन पियर्स

34

मैं सेकंड में परिणाम प्राप्त करता रहा, इसलिए इसने मेरे लिए काम किया:

(Time.now - self.created_at) / 86400

1
@Epigene 1.dayनहीं है rubyके रूप में ओ पी (टैग में) का अनुरोध किया। यह Railsअधिक विशिष्ट है, active supportहालांकि created_atमूल रूप से इसमें एक Modelविधि है Rails..
राको 14

26

समय सीमा में दिनों की संख्या प्राप्त करने के लिए (बस सभी दिनों की गिनती)

(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

इसके लिए धन्यवाद @ a14m! मुझे समावेशी और अनन्य तारीख कैप्चर करने का एक तरीका दिया :)
क्रिश

18

पिछले उत्तरों में से कोई भी (आज तक) दो तारीखों के बीच के दिनों में सही अंतर नहीं देता है।

एक है कि सबसे करीब आता है के द्वारा होता है 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इसके बजाय उपयोग करें ।


जब डीएसटी संक्रमण आगे बढ़ रहा होता है तो यह अपेक्षा के अनुरूप काम नहीं कर सकता है। इस मामले में, डीएसटी संक्रमणकालीन दिन की लंबाई वैध रूप से 24 घंटे से कम है, लेकिन पूर्णांक अंकगणितीय होने के कारण उस दिन बिल्कुल भी प्रतिबिंबित नहीं होगा।
पिनीएम

4

दो तिथियों ( DateTimeवस्तुओं) के बीच पूरे दिन की संख्या :

((end_at - start_at).to_f / 1.day).floor

यूएसटी ने जो जवाब दिया, उसी के अनुसार डीएसटी मुद्दा। समय के साथ अंकगणित उतना सरल नहीं है जितना आप उम्मीद करेंगे :)
PinnyM

0

दो दिनों के अंतर से दिनों की संख्या प्राप्त करने के लिए:

(start.to_date...end.to_date).count - 1
or 
(end.to_date - start.to_date).to_i

-8
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

3
दिनांक वस्तुओं को घटाना ज्यादा आसान है।
OpenCoderX

व्यावसायिक दिनों के लिए समायोजन के बारे में ओपी ने कभी नहीं पूछा। यह वास्तव में वैसे भी दृढ़ है।
नाथन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.