तारीख सीमा के बीच जावास्क्रिप्ट लूप


135

दो Date()वस्तुओं को देखते हुए , जहां एक दूसरे से कम है, मैं तारीखों के बीच हर दिन कैसे लूप करता हूं?

for(loopDate = startDate; loopDate < endDate; loopDate += 1)
{

}

क्या इस तरह का लूप काम करेगा? लेकिन मैं एक दिन को लूप काउंटर से कैसे जोड़ सकता हूं?

धन्यवाद!

जवाबों:


201

यहां एक तरीका यह है कि एक दिन को जोड़ने के तरीके का उपयोग करके तारीख को अगले महीने तक रोल करने का कारण बनता है यदि आवश्यक हो, और बिना मिलीसेकंड के साथ गड़बड़ किए बिना। डेलाइट बचत कोई समस्या नहीं है।

var now = new Date();
var daysOfYear = [];
for (var d = new Date(2012, 0, 1); d <= now; d.setDate(d.getDate() + 1)) {
    daysOfYear.push(new Date(d));
}

ध्यान दें कि यदि आप तारीख को स्टोर करना चाहते हैं, तो आपको एक नया (जैसा कि ऊपर दिया गया है new Date(d)) बनाने की आवश्यकता होगी , या फिर आप हर संग्रहीत तिथि dको लूप में अंतिम मान होने के साथ समाप्त करेंगे ।


अन्य सभी उत्तरों की तुलना में बहुत अधिक पठनीय। 86400000 मिलिसेकंड जोड़ना प्रत्येक लूप बहुत पठनीय नहीं है।
ओवेन

1
दिन के समय की बचत से सावधान रहें। d.getDate () + 1 जब d.getDate () = GMT N और d.getDate () + 1 = GMT N - 1 d.getDate () + 1 महीने के एक ही दिन में दो बार रिटर्न देता है।
राफेल फ़ॉन्ट

1
Date.now()परिभाषित करते समय क्यों करते हैं now? new Date() डिफ़ॉल्ट रूप से वर्तमान दिनांक को ऑब्जेक्ट के रूप में देता है । कंस्ट्रक्टर के Dateबिना कॉल करने से newआपको एक डेट स्ट्रिंग मिलती है जिसे आप फिर डेट ऑब्जेक्ट में बदल देते हैं?
17

मेरे new Date(2012, 0, 1);लिए गलत दिन उठा रहा था (एक दिन पहले), new Date(Date.UTC(2012, 0, 1))ठीक काम किया।
T4421

मैंने इंटरनेट पर कई समाधानों की कोशिश की है। अजीब है कि यह कभी-कभी कुछ दिनों के लिए छोड़ देता है। जैसे १.१२, २.१२, ३.१२, ५.१२ ... (नोटिस ४.१२ छोड़ दिया जाता है) मुझे नहीं पता कि ऐसा क्यों होता है ... किसी को भी यह समस्या हुई और इसका हल मिल गया?
एरिक कुबिका

73

टॉम गुलेन के उत्तर के आधार पर।

var start = new Date("02/05/2013");
var end = new Date("02/10/2013");


var loop = new Date(start);
while(loop <= end){
   alert(loop);           

   var newDate = loop.setDate(loop.getDate() + 1);
   loop = new Date(newDate);
}

इसका उपयोग करने के लिए आपको क्या आयात करना होगा?
देवअल्पनर

3
@DevAllanPer कुछ भी नहीं है, Dateएक वैश्विक वस्तु डेवलपर
दिमित्री

9

यदि प्रारंभ और अंतिम तिथि वास्तव में दिनांक ऑब्जेक्ट हैं तो आप उन्हें आधी रात के बाद से 1, 1970 की संख्या में मिलिसेकंड की संख्या में बदल सकते हैं:

var startTime = startDate.getTime(), endTime = endDate.getTime();

तब आप 86400000 (1000 * 60 * 60 * 24) - एक दिन में मिलीसेकंड की संख्या से एक से बढ़ कर लूप टाइम तक लूप कर सकते हैं:

for(loopTime = startTime; loopTime < endTime; loopTime += 86400000)
{
    var loopDay=new Date(loopTime)
    //use loopDay as you wish
}

1
+1, मुझे काम करने के लिए पर्याप्त दिया, ive ने मेरे प्रश्न में काम करने वाले समाधान को शामिल किया
टॉम गुलेन

5
यह तब काम नहीं करता है जब दिन के उजाले की बचत के समय में बदलाव होता है (उन क्षेत्रों में जहां यह एक मुद्दा है)। अच्छा समाधान अन्यथा।
chadgh

3
आप यह नहीं मान सकते कि 86400000एक दिन में कुछ सेकंड हैं। यह लूप दिन के उजाले बचत परिवर्तन और अन्य किनारे की स्थिति के लिए नाजुक है।
जेरेमी जे स्टारचेर सेप

2
डीएसटी के अलावा, एक और बढ़त की स्थिति "लीप सेकंड" है। एक दूसरे अंतर से कोई फर्क नहीं पड़ता - मिलीसेकंड में परिवर्तित तिथियां किसी दिए गए दिन के पहले दूसरे से मेल खाती हैं। एक दूसरी त्रुटि और आप पिछले दिन उतर गए।
वोजटेक क्रुज़ेव्स्की

9

मुझे लगता है कि मुझे और भी सरल उत्तर मिला, यदि आप खुद को Moment.js का उपयोग करने की अनुमति देते हैं :

// cycle through last five days, today included
// you could also cycle through any dates you want, mostly for
// making this snippet not time aware
const currentMoment = moment().subtract(4, 'days');
const endMoment = moment().add(1, 'days');
while (currentMoment.isBefore(endMoment, 'day')) {
  console.log(`Loop at ${currentMoment.format('YYYY-MM-DD')}`);
  currentMoment.add(1, 'days');
}
<script src="https://cdn.jsdelivr.net/npm/moment@2/moment.min.js"></script>



2
var start = new Date("2014-05-01"); //yyyy-mm-dd
var end = new Date("2014-05-05"); //yyyy-mm-dd

while(start <= end){

    var mm = ((start.getMonth()+1)>=10)?(start.getMonth()+1):'0'+(start.getMonth()+1);
    var dd = ((start.getDate())>=10)? (start.getDate()) : '0' + (start.getDate());
    var yyyy = start.getFullYear();
    var date = dd+"/"+mm+"/"+yyyy; //yyyy-mm-dd

    alert(date); 

    start = new Date(start.setDate(start.getDate() + 1)); //date increase by 1
}

1

तबरेज के जवाब के आधार पर, मुझे अंत में एक दिन और जोड़ना था, क्योंकि चक्र पहले काटा जाता है

var start = new Date("02/05/2013");
var end = new Date("02/10/2013");
var newend = end.setDate(end.getDate()+1);
var end = new Date(newend);
while(start < end){
   alert(start);           

   var newDate = start.setDate(start.getDate() + 1);
   start = new Date(newDate);
}


0

आइए मान लें कि आपको यूआई से आरंभ तिथि और समाप्ति तिथि मिली और इसे नियंत्रक में गुंजाइश चर में संग्रहीत किया गया।

फिर एक ऐरे की घोषणा करें जो हर फ़ंक्शन कॉल पर रीसेट हो जाएगा ताकि फ़ंक्शन के लिए अगले कॉल पर नया डेटा संग्रहीत किया जा सके।

var dayLabel = [];

नई तिथि (अपना आरंभिक चर) का उपयोग करना याद रखें क्योंकि यदि आप नई तिथि का उपयोग नहीं करते हैं और सीधे सेट चर पर असाइन करते हैं, तो प्रत्येक पुनरावृति में मूल चर मान बदल जाएगा

for (var d = new Date($scope.startDate); d <= $scope.endDate; d.setDate(d.getDate() + 1)) {
                dayLabel.push(new Date(d));
            }

-2

Jayarjo के जवाब पर आधारित:

var loopDate = new Date();
loopDate.setTime(datFrom.valueOf());

while (loopDate.valueOf() < datTo.valueOf() + 86400000) {

    alert(loopDay);

    loopDate.setTime(loopDate.valueOf() + 86400000);
}

इसके लिए एक टिप्पणी यह ​​है कि तुलना की तुलना में कम पसंद की जाती है! =, जब किसी कारण से कई महीनों तक लूप खत्म हो जाता है! = तुलना कभी नहीं होती है।
टॉम गुलेन 12

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