У меня проблемы с удалением выходных в моем коде

Я делаю страницу сайта для школы, где человек может указать две даты:

  1. день начал работать в компании
  2. день перестал работать на компанию (когда заканчивается контракт)

эти дни заполняются в формате MM-DD-YYYY

Когда человек вводит дату начала, он вычисляет следующую формулу: "отработанные дни = сегодняшняя дата - дата, когда человек начал работать" после этого он вычисляет ее в днях, а не в миллисекунды (отработано дней/1000/60/60/24).

Теперь мне нужно избавиться от Saturday и Sunday каждой недели, когда работал один человек.

Редактировать: исправлено, всем спасибо

Код JavaScript

    function days_of_a_year(year) { return isLeapYear(year) ? 366 : 365; }
    function isLeapYear(year) { return year % 400 === 0 || (year % 100 !== 0 && year % 4 === 0); }
    var year    = moment().year();
    var days_year = days_of_a_year(moment().year());
    $(document).ready(function(){


    $(".form-control").keyup(function(){
        //get
        var leave_days = $('#leave_days').val(),
         leave_hours = $('#leave_hours').val(),
         hours_employee_week = $('#hours_employee_week').val(),
         hours_week = $('#hours_week').val(),
         date_employed = $('#date_employed').val(),
         date_unemployed = $('#date_unemployed').val(),

         start = new Date(date_employed),
         end   = new Date(date_unemployed),
         diff  = new Date(end - start),
         days  = Math.round(diff/1000/60/60/24),
            now = new Date(),
            days_worked = new Date(now - start),
         year = moment().year();


        var leave_hours_full = leave_days * leave_hours;
        var perc_employment =  hours_employee_week / hours_week * 100;
        var leave_hours_year = leave_hours_full * (hours_employee_week / hours_week);

        var days_worked_year = Math.round(days_worked/1000/60/60/24);

        console.log(parseInt(days_worked_year));


        $('#days_worked_year').val(days);
        $('#days_full_year').val(days_year);
        $('#perc_worked_year').val(days_worked_year);

person Luuk S    schedule 02.09.2019    source источник


Ответы (2)


Я считаю, что этот вопрос похож на ваш. Принятый ответ на этот вопрос обеспечивает эту функцию:

// Expects start date to be before end date
// start and end are Date objects
function dateDifference(start, end) {

  // Copy date objects so don't modify originals
  var s = new Date(+start);
  var e = new Date(+end);

  // Set time to midday to avoid dalight saving and browser quirks
  s.setHours(12,0,0,0);
  e.setHours(12,0,0,0);

  // Get the difference in whole days
  var totalDays = Math.round((e - s) / 8.64e7);

  // Get the difference in whole weeks
  var wholeWeeks = totalDays / 7 | 0;

  // Estimate business days as number of whole weeks * 5
  var days = wholeWeeks * 5;

  // If not even number of weeks, calc remaining weekend days
  if (totalDays % 7) {
    s.setDate(s.getDate() + wholeWeeks * 7);

    while (s < e) {
      s.setDate(s.getDate() + 1);

      // If day isn't a Sunday or Saturday, add to business days
      if (s.getDay() != 0 && s.getDay() != 6) {
        ++days;
      }
    }
  }
  return days;
}
person Alessandro    schedule 02.09.2019
comment
Это действительно помогло мне, спасибо!! - person Luuk S; 02.09.2019

Вот как бы я это сделал:

function daysWorked(firstDay, lastDay) {
  let daysWorked = 0;

  for (
    let cursor = new Date(+firstDay);
    cursor.getTime() <= lastDay.getTime();
    cursor.setDate(cursor.getDate() + 1)
  ) {
    let day = cursor.getDay();
    // skip Saturdays and Sundays
    if (day === 0 || day === 6) {
      continue;
    }
    daysWorked++;
  }
  return daysWorked;
}

У меня такое чувство, что это может быть немного менее эффективным, чем предыдущий ответ, в зависимости от того, насколько хорошо JavaScript работает с датами.

Позвольте мне попробовать небольшой тест...

С 16.06.2019 по 02.09.2019

  • 1 миллион раз dateDifference() из предыдущего ответа: 3698 миллисекунд
  • 1 миллион раз daysWorked() из моего ответа: 47979 миллисекунд

в 12 раз медленнее...

С 16.06.2015 по 02.09.2019

  • 10 тысяч раз dateDifference() из предыдущего ответа: 95 миллисекунд
  • 10k раз daysWorked() из моего ответа: 9054 миллисекунды

~ в 100 раз медленнее...

Ладно, забудь мой ответ xD

person Ki Jéy    schedule 02.09.2019