Проблема с этим кодом:
strDate = new Date(strDate).toLocaleDateString();
Несмотря на то, что в комментариях вы указали, что это даст строковое представление в формате MM / dd / YYYY, это не гарантируется. Как описано в mdn (курсив мой):
Метод toLocaleDateString()
возвращает строку с чувствительным к языку представлением части даты этой даты,
Например, когда я набираю следующее в консоли моего браузера:
new Date().toLocaleDateString()
... тогда в FireFox я получаю:
"29.10.2009 "
- это то, что вы ожидаете, но в Chrome я получаю:
" 29-10-2019 "
По-видимому, существует некоторая путаница с тем, что на самом деле является моей локалью. Однако важно то, что неверно принимать какой-либо формат (если вы не передаете аргументы toLocaleDateString
, которые делают его независимым от вашего текущего языкового стандарта).
Итак, представьте, что вы передаете объект Date 29.10.2009на convertDateToString
: в последнем случае он даже не найдет косые черты в строке, возвращаемой .toLocaleDateString
, и поэтому возвращаемая строка будет "// 2019". Когда GetNextDayDate
пытается сделать из этого объект Date, он возвращает недопустимую Date.
Следовательно, условие if
в вашем цикле всегда будет истинным, и новая запись будет вставлена в ваш цикл. массив, что делает длину вашего массива больше, и поэтому цикл никогда не заканчивается.
Решение состоит в том, чтобы выполнять преобразование даты в строку только тогда, когда это действительно необходимо, а когда вы делаете, использовать методы Date дляизвлеките части даты, а не toLocaleDateString
.
Вот исправленный код:
for (var i = 0; i < dateArray.length - 1; i++) {
var currentDate = GetDate(dateArray[i]);
var nextDate = GetDate(dateArray[i + 1]);
var shouldBeNextDate = GetNextDayDate(currentDate);
// No need to convert to String
if (shouldBeNextDate < nextDate) {
dateArray.splice(i + 1, 0, convertDateToString(shouldBeNextDate));
}
}
console.log(dateArray);
function GetDate(date){
var numbers = date.match(/\d+/g);
return new Date(numbers[2], numbers[1] - 1, numbers[0]);
}
function GetNextDayDate(date) { // Don't convert to string here.
date = new Date(date); // clone the date
date.setDate(date.getDate() + 1); // add one day to it
return date;
}
function convertDateToString(date) {
// Get the date parts directly
let tempMM = date.getMonth() + 1;
let tempDD = date.getDate();
let tempYYYY = date.getFullYear();
// Pad with zeroes where needed
return (tempDD + "/" + tempMM + "/" + tempYYYY).replace(/\b\d\b/g, "0$&");
}