Петля Javascript между диапазонами дат
Учитывая два объекта Date(), где один меньше другого, как я могу каждый день цитировать между датами?
for(loopDate = startDate; loopDate < endDate; loopDate += 1)
{
}
Будет ли такой цикл работать? Но как я могу добавить один день на счетчик циклов?
Спасибо!
Ответы
Ответ 1
Здесь способ сделать это, используя способ добавления одного дня, заставляет дату переходить на следующий месяц, если это необходимо, и не вмешиваться в миллисекунды. Летняя экономия также не является проблемой.
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
в цикле.
Ответ 2
Основано на ответе Тома Гуллена.
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
Если startDate и endDate являются объектами даты, вы можете преобразовать их в число миллисекунд с полуночи 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
}
Ответ 4
Я думаю, что нашел еще более простой ответ, если вы позволите себе использовать 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/[email protected]/moment.min.js"></script>
Ответ 5
Вот простой рабочий код, у меня работает
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
}
Ответ 6
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
}
Ответ 7
Основываясь на ответе Tabare,
Я должен был добавить еще один день в конце, так как цикл обрезается раньше
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);
}
Ответ 8
Если вы хотите эффективный способ с миллисекундами:
var daysOfYear = [];
for (var d = begin; d <= end; d = d + 86400000) {
daysOfYear.push(new Date(d));
}
Ответ 9
Предположим, вы получили начальную и конечную даты из пользовательского интерфейса и сохранили их в переменной области действия в контроллере.
Затем объявите массив, который будет сбрасываться при каждом вызове функции, чтобы при следующем вызове функции новые данные могли быть сохранены.
var dayLabel = [];
Не забудьте использовать новую дату (вашу начальную переменную), потому что, если вы не используете новую дату и напрямую назначаете ее переменной, функция setDate будет изменять значение исходной переменной в каждой итерации '
for (var d = new Date($scope.startDate); d <= $scope.endDate; d.setDate(d.getDate() + 1)) {
dayLabel.push(new Date(d));
}
Ответ 10
Основываясь на ответе Джаярджо:
var loopDate = new Date();
loopDate.setTime(datFrom.valueOf());
while (loopDate.valueOf() < datTo.valueOf() + 86400000) {
alert(loopDay);
loopDate.setTime(loopDate.valueOf() + 86400000);
}