0

Ich bin eine Art Neuling, und ich versuche (unter Verwendung moment.js), alle Zeitfenster zwischen zwei Daten exklusive zu bekommen etwas. Etwas präziser.Erhalten Sie alle Zeitfenster (und schließen Sie einige) zwischen zwei Daten mit moment.js (Endlosschleife Problem?)

  • Ich habe eine start date (sagen wir Montag) und end date (zB Mittwoch)
  • ich eine array aller 30 Minuten Slots (Montag 00.00 Uhr, Montag 00.30 ... Dienstag 9 erhalten möchten: 00, dienstag 09.30, dienstag 10.00 ...)
  • Aber ohne - zum Beispiel - Slots vor 09.00 Uhr ...

const dates = [] 

const now = moment(now).startOf('day').hour(9).minute(0).seconds(0) 
const deadline = moment(end).hour(19).minute(0).seconds(0)  

while (now.diff(deadline) < 0) { 
    if (now > now.hour(9)) { 
    dates.push(now.format('YYYY-MM-DD HH:mm')) 
    } 
    now.add(30, 'minutes') 
} 

Ohne if Anweisung, Dinge funktionieren (mein Array enthält alle Tage zwischen meinen zwei Daten). Aber mit if, stürzt mein Browser (Endlosschleife?). Aber ich weiß nicht warum ... Irgendeine Idee? Ich würde gerne lernen ...

Antwort

0

Weil Moment Objekt veränderbar sind, so now.hour(9) (re) Stunden = 9 bis now Instanz, so wird now.diff(deadline) < 0 immer wahr sein. Siehe Get + Set setion der docs:

Hinweis: Alle diese Methoden, um den ursprünglichen Moment mutieren, wenn sie als Setter verwendet.

können Sie klonen now (mit clone() Funktion oder mit moment(now)) in Ihrer wenn Bedingung.

Hier ein Live-Beispiel:

const dates = [] 
 

 
const now = moment().startOf('day').hour(9).minute(0).seconds(0) 
 
const deadline = moment().hour(19).minute(0).seconds(0) 
 

 
while (now.diff(deadline) < 0) { 
 
    if (now > moment(now).hour(9)) { 
 
    dates.push(now.format('YYYY-MM-DD HH:mm')) 
 
    } 
 
    now.add(30, 'minutes'); 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.3/moment.min.js"></script>

Als allgemeine Regel gilt, nicht vergleichen Moment Objekt mit > und <, verwenden Abfragemethoden wie isAfter, isBefore etc

+0

Arbeiten wie Ein Zauber! Dank Mit Datum-FNS (leichtere Bibliothek): 'while (isBefore (jetzt Frist)) { dates.push (jetzt) ​​ jetzt = AddMinutes (jetzt 30) }' – nerotulip

Verwandte Themen