Tarih aralıkları arasında JavaScript döngüsü


135

Date()Biri diğerinden daha az olan iki nesne göz önüne alındığında , tarihler arasında her gün nasıl döngü yaparım?

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

}

Bu tür bir döngü işe yarar mı? Peki döngü sayacına nasıl bir gün ekleyebilirim?

Teşekkürler!

Yanıtlar:


201

Burada, bir gün eklemenin, gerektiğinde tarihin bir sonraki aya devredilmesine ve milisaniyelerle uğraşmadan yol almasından yararlanmanın bir yolu. Yaz saati uygulaması da sorun değil.

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));
}

Tarihi depolamak istiyorsanız, yeni bir tarih (yukarıdaki gibi new Date(d)) yapmanız gerektiğini, aksi takdirde depolanan her tarihin ddöngüdeki son değeri olacağına dikkat edin .


Diğer tüm cevaplardan çok daha okunabilir. Her bir döngüye 86400000 milisaniye eklemek çok okunaklı değildir.
Owen

1
Yaz saati uygulamasına dikkat edin. d.getDate () = GMT N ve d.getDate () + 1 = GMT N - 1 d.getDate () + 1 ayın aynı gününü iki kez döndürdüğünde d.getDate () + 1.
Rafael Fontes

1
Neden Date.now()tanımlarken now? new Date() geçerli tarihi varsayılan olarak nesne olarak döndürür . Yapıcı Dateolmadan çağırmak new, size bir Date nesnesine dönüştürebileceğiniz bir Date dizesi verir mi?
tatlar

Benim new Date(2012, 0, 1);için yanlış bir gün (bir gün önce) new Date(Date.UTC(2012, 0, 1))alıyordu, iyi çalıştı.
Tk421

İnternette birden fazla çözüm denedim. Garip, bazen birkaç gün atlaması. 1.12, 2.12, 3.12, 5.12 gibi ...
Erik Kubica


9

StartDate ve endDate gerçekten tarih nesneleriyse, bunları 1 Ocak 1970 gece yarısından bu yana milisaniye sayısına dönüştürebilirsiniz, şöyle:

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

Daha sonra 86400000 (1000 * 60 * 60 * 24) - bir gün içindeki milisaniye sayısı kadar birinden diğerine artan döngü döngüsünü döngüye alabilirsiniz:

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

1
+1, üzerinde çalışmam için yeterince şey verdi, sorumu çalışma çözümüne dahil ettim
Tom Gullen

5
gün ışığından yararlanma saati değişikliğini (bu bir sorun olan alanlarda) geçtikten sonra çalışmaz. Aksi takdirde iyi bir çözüm.
chadgh

3
86400000Bir günde saniyeler olduğunu varsayamazsınız . Bu döngü gün ışığından tasarruf değişikliklerine ve diğer kenar koşullarına kırılgandır.
Jeremy J Starcher

2
DST'nin yanı sıra, diğer bir kenar koşulu "Artık saniye" dir. Bir tane ikinci fark yok olsun - milisaniye dönüştürülen Tarihler belirli bir günde ilk saniyesinde karşılık gelmektedir. Bir saniye hata ve önceki gün iniyorsun.
Wojtek Kruszewski

9

Moment.js'yi kullanmanıza izin verirseniz, daha da basit bir cevap bulduğumu düşünüyorum :

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


5

İşte basit çalışma kodu, benim için çalıştı

var from = new Date(2012,0,1);
var to = new Date(2012,1,20);
    
// loop for every day
for (var day = from; day <= to; day.setDate(day.getDate() + 1)) {
      
   // your day is here

}


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

Tabare'nin Cevabına dayanarak, döngü daha önce kesildiği için sonuna bir gün daha eklemek zorunda kaldım

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

Milisaniye ile verimli bir yol istiyorsanız:

var daysOfYear = [];
for (var d = begin; d <= end; d = d + 86400000) {
    daysOfYear.push(new Date(d));
}

0

Kullanıcı arayüzünden başlangıç ​​tarihi ve bitiş tarihi aldığınızı ve bunu denetleyicideki kapsam değişkeninde sakladığınızı varsayalım.

Ardından, her işlev çağrısında sıfırlanacak bir dizi bildirerek işlev için bir sonraki çağrıda yeni verilerin depolanabilmesini sağlayın.

var dayLabel = [];

Yeni Tarih (başlangıç ​​değişkeniniz) kullanmayı unutmayın, çünkü yeni tarihi kullanmazsanız ve doğrudan değişkene atarsanız, setDate işlevi her bir yinelemedeki orijinal değişken değerini değiştirir.

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

-2

Jayarjo'nun cevabına dayanarak:

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

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

    alert(loopDay);

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

Bunun için bir yorum, herhangi bir nedenden ötürü birden fazla ay boyunca döngü yapıldığında olduğu gibi! = Karşılaştırmasının hiçbir zaman tetiklenmediği gibi!
Tom Gullen

1
DST'nin yanı sıra, diğer bir kenar koşulu "Artık saniye" dir. Bir tane ikinci fark yok olsun - milisaniye dönüştürülen Tarihler belirli bir günde ilk saniyesinde karşılık gelmektedir. Bir saniye hata ve önceki gün iniyorsun.
Wojtek Kruszewski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.