Получение недель с даты начала и окончания в javascript

#javascript #date

#javascript #Дата

Вопрос:

Я создаю функцию расписания, для этого мне нужно вставить данные за неделю в коллекцию.

Итак, я создаю массив, который будет содержать недели от start_date до end_date.

1-й ввод в массив: start_date = Объявленная дата (если объявленная дата — воскресенье, то она учитывает дату наступления понедельника); end_date = дата в субботу

со 2-го по n-й ввод в массив: start_date = дата в понедельник; end_date = дата в субботу или объявленная конечная дата, если она находится в пределах недели

 var start = new Date("09/30/2016");
var end = new Date("11/2/2016");

var count = 0;
var sDate;
var eDate;
var dateArr = [];

while(start <= end){
    if (start.getDay() == 0){
        count = 0;
    }else {
        if(count == 0){
            sDate = start;
            count = 1
        }else {
            count = 1;
        }

        if(start.getDay() == 6 || start == end){
            count = 1
            eDate = start;
        }else {
            count = 1;
        }

        if(sDate amp;amp; eDate){
            sDate = new Date(sDate)
            eDate = new Date(eDate)
            dateArr.push({'startDate': sDate, 'endDate': eDate});
            sDate = undefined;
            eDate = undefined;
        }
    }

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

Но результат, который я получаю, таков

 [{
    'startDate':Sat Oct 01 2016 00:00:00 GMT 0530 (IST),
    'endDate':Sat Oct 01 2016 00:00:00 GMT 0530 (IST),
},
{
    'startDate':Tue Oct 04 2016 00:00:00 GMT 0530 (IST),
    'endDate':Sat Oct 08 2016 00:00:00 GMT 0530 (IST),
},
{
    'startDate':Tue Oct 11 2016 00:00:00 GMT 0530 (IST),
    'endDate':Sat Oct 15 2016 00:00:00 GMT 0530 (IST),
},
{
    'startDate':Tue Oct 18 2016 00:00:00 GMT 0530 (IST),
    'endDate':Sat Oct 22 2016 00:00:00 GMT 0530 (IST),
},
{
    'startDate':Tue Oct 25 2016 00:00:00 GMT 0530 (IST),
    'endDate':Sat Oct 29 2016 00:00:00 GMT 0530 (IST),
}]
  

Редактировать:

Ожидаемый результат:

 [{
    'startDate':Fri Sep 30 2016 00:00:00 GMT 0530 (IST),
    'endDate':Sat Oct 01 2016 00:00:00 GMT 0530 (IST),
},
{
    'startDate':Mon Oct 03 2016 00:00:00 GMT 0530 (IST),
    'endDate':Sat Oct 08 2016 00:00:00 GMT 0530 (IST),
},
{
    'startDate':Mon Oct 10 2016 00:00:00 GMT 0530 (IST),
    'endDate':Sat Oct 15 2016 00:00:00 GMT 0530 (IST),
},
{
    'startDate':Mon Oct 17 2016 00:00:00 GMT 0530 (IST),
    'endDate':Sat Oct 22 2016 00:00:00 GMT 0530 (IST),
},
{
    'startDate':Mon Oct 24 2016 00:00:00 GMT 0530 (IST),
    'endDate':Sat Oct 29 2016 00:00:00 GMT 0530 (IST),
},
{
    'startDate':Mon Oct 31 2016 00:00:00 GMT 0530 (IST)
    'endDate':Wed Nov 02 2016 00:00:00 GMT 0530 (IST),
}]
  

Комментарии:

1. взгляните на momentsjs

2. @miraculixx Перед вводом в массив начальной даты, если консоль. журнал отображает понедельник. Я пробовал использовать moments.js слишком. дата начала по-прежнему отображается как следующая дата

3. Какой результат вам нужен (количество недель между датами)?

4. @AlexanderElgin Мне нужна вся дата начала и окончания недели между заданными датами в массиве объекта

5. @AlexanderElgin Я добавил свой ожидаемый результат в вопрос

Ответ №1:

Проверьте это. Я исправил некоторые логические и ссылочные ошибки obj.

 var start = new Date(Date.UTC(2016, 09, 30, 0, 0, 0));
var end = new Date(Date.UTC(2016, 11, 02, 0, 0, 0));
var sDate;
var eDate;
var dateArr = [];

while(start <= end){
  if (start.getDay() == 1 || (dateArr.length == 0 amp;amp; !sDate)){
    sDate = new Date(start.getTime());
  }

  if ((sDate amp;amp; start.getDay() == 0) || start.getTime() == end.getTime()){
        eDate = new Date(start.getTime());
  }

  if(sDate amp;amp; eDate){
    dateArr.push({'startDate': sDate, 'endDate': eDate});
    sDate = undefined;
    eDate = undefined;
  }

    start.setDate(start.getDate()   1);
}

console.log(dateArr);
  

https://jsfiddle.net/c58zde4b/6/

Отображаемая дата может отличаться из-за настроек вашего местного часового пояса.

Комментарии:

1. В этом случае первым объектом в массиве является понедельник, но в моем ожидаемом результате это пятница. Все остальные объекты получают начальную дату как воскресенье. Плюс количество объектов на 1 меньше

2. Пожалуйста, смотрите обновленный ответ. — Примечание: воскресенье равно 0, понедельник равен 1 и так далее. — Если даты не совпадают с небольшим смещением, значит, вы смотрите на правильный часовой пояс.

3. Я внес некоторые изменения в ваш ответ, который сработал для меня, просто просмотрите его. Я отмечу это как ответ

4. Я не вижу ваших изменений в моем URL. Каждый раз, когда вы сохраняете новые изменения в jsfiddle, создается новый URL-адрес. Спасибо, что выбрали мой ответ 🙂

5. Ответ должен объяснить проблему OP и то, как ваш код ее исправляет. Простая публикация кода может помочь OP, но это не поможет другим пользователям, у которых может быть такая же проблема (что бы это ни было). В частности, какой смысл использовать Date.UTC ?