Рассчитать выходные в React Native

Я пытаюсь создать метод для расчета общего количества выходных.

У меня есть массив, содержащий рабочие дни:

"рабочие дни": [1,2,3,4,5],

Итак, у меня есть две даты; a startDate и endDate, и я должен посчитать в этом диапазоне, сколько дней нерабочие (т.е. общее количество выходных).

Например, у меня диапазон с 15.03 (сегодня) по 21.03, итого 7 дней.

Сегодня (15.03) день 2, и это рабочий день, поэтому мне не нужно увеличивать счетчик выходных дней, а например 19.03 не рабочий день (это номер 6), поэтому у меня есть для увеличения переменной выходного дня.

Я попытался реализовать код, но он работает неправильно:

const checkDate = (start, end) => {
    const workingDays = [1,2,3,4,5]
    let dayOff = 0
    var currentDate = new Date(start)
    while (currentDate <= end) {
      workingDays.map((day) => {
        console.info('current ', currentDate.getDay(), ' day ', day)
        if (currentDate.getDay() !== day) {
          dayOff += 1
        }
        currentDate = currentDate.addDays(1)
      })
    }
    console.info('dayOff ', dayOff)
    return dayOff

  }

он печатает меня:

LOG  current  2  day  1
 LOG  current  3  day  2
 LOG  current  4  day  3
 LOG  current  5  day  4
 LOG  current  6  day  5
 LOG  current  0  day  1
 LOG  current  1  day  2
 LOG  current  2  day  3
 LOG  current  3  day  4
 LOG  current  4  day  5
 LOG  dayOff  10

но это неправильно, потому что результат должен быть 2.

Как я могу сделать? Спасибо

РЕДАКТИРОВАТЬ.

Функция, которую я использую для добавления дня:

 Date.prototype.addDays = function (days) {
    var date = new Date(this.valueOf())
    date.setDate(date.getDate() + days)
    return date
  }

Используйте date = new Date(date.setUTCDate(date.getUTCDate() + 1));, чтобы увеличить дату. Смотрите мой ответ ниже. Надеюсь, это поможет вам.

Mohsen Alyafei 15.03.2022 11:55

У вас есть мой голос за вопрос.

Mohsen Alyafei 15.03.2022 11:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
currentDate = currentDate.addDays(1)

.addDays не является правильной функцией Javascript. Он используется в С#.

Ниже приведен правильный код, который вернет правильный ответ:

    const workingDays = [1,2,3,4,5]
const endDate = new Date(startDate)
    let dayOff = []
    var currentDate = new Date(endDate)
    
    while (currentDate <= endDate) {
        console.info('currentDate', currentDate)
        let index = workingDays.indexOf(currentDate.getDay());

        console.info('dayOff - index', index)
        if (index == -1)
        {
            console.info('dayOffDate - addded', currentDate)
            dayOff.push(currentDate)
        }
        currentDate = new Date(currentDate.setDate(currentDate.getDate() + 1))
      }

вы даже можете сослаться на stackoverflow.com/questions/563406/как добавить дни до даты

Ajay Patel 15.03.2022 11:00

Я забыл вставить функцию, которую я использую для добавления дня

Jack23 15.03.2022 11:02

хорошо, позвольте мне проверить это еще раз

Ajay Patel 15.03.2022 11:09

Хорошо, спасибо, мне нужно проверить каждую дату в диапазоне с каждым элементом в массиве, пока я проверяю дату с первым элементом, если они не равны, я проверяю день + 1 со вторым элементом массива ( пока я должен сравниваться со вторым элементом массива)

Jack23 15.03.2022 11:11

Да, точно. это сработает.

Ajay Patel 15.03.2022 11:16

Я обновил свой исходный ответ

Ajay Patel 15.03.2022 11:44

@AjayPatel, в целом, лучше использовать версии UTC методов Date(), чтобы избежать ошибок из-за разницы во времени / поясе.

Mohsen Alyafei 15.03.2022 12:15

@MohsenAlyafei Я думаю, я не думаю, что это нужно для клиентской стороны, но вы работаете с другим часовым поясом, тогда да

Ajay Patel 15.03.2022 12:21

Следующая небольшая функция рассчитает общее количество выходных дней между двумя (2) датами, учитывая первую дату и дату окончания.

Это просто и предполагает, что дата окончания совпадает с датой начала или выше (не проверяет изменение дат).

function getTotalOffDays(start,end) {
    const workingDays = [1,2,3,4,5];
    let daysOff = 0,                  // days off counter
        date    = new Date(start),    // starting date
        endDate = new Date(end);      // end date
  while (date <= endDate) {
    if (!workingDays.includes(date.getUTCDay())) daysOff += 1;   // increment days off
    date = new Date(date.setUTCDate(date.getUTCDate() + 1));  // go the next day
  }
return daysOff;
}
console.info("Total days off: " + getTotalOffDays("2022-03-15", "2022-03-21"));

Другие вопросы по теме