2015-05-21 3 views
6

Справочной информацииХотя счетчик цикла увеличивается «экспоненциально» несмотря на использование ++

Я настраиваю функцию, которая создает массив даты, основанный на дату начала и дату окончания.

Функция получит даты начала и окончания, которые сначала были отформатированы до year-month-dayT12:00:00:00, а затем преобразованы в миллисекунды с форматом .getTime().

Мой сценарий

Я сделал следующий сценарий для создания массива.

var $date_array = []; 

function calc_workdays_between_dates (a, b) { 

    function $create_date_array ($start_date, $end_date) { 

     var $counter = 0; 

     while ($start_date !== $end_date) { 

      var x = new Date($start_date); 

      x.setDate(x.getDate() + $counter); 
      $date_array.push(x); 
      $start_date = x.getTime(); 
      $counter++; 
     } 
    } 

    $create_date_array (a, b); 
} 

Пожалуйста, обратите внимание, что есть причина для гнездования функции $create_date_array внутри функции $calc_workdays_between_dates. На данный момент я удалил все остальные части функции $calc_workdays_between_dates, чтобы сосредоточиться исключительно на проблеме (я также запускаю свои тесты на этой урезанной версии), поэтому остальная часть функции не влияет на что-либо).

Моя проблема

Пример 1:

Если я вызываю функцию с calc_workdays_between_dates (x1, x2); где:

x1 = new Date("2015-04-04") //formatted and converted to ms before invoking function 
x2 = new Date("2015-04-07") 

это приводит к $date_array получения следующего содержания:

Sat Apr 04 2015 12:00:00 GMT+0200 (CEST) 
Sun Apr 05 2015 12:00:00 GMT+0200 (CEST) 
Tue Apr 07 2015 12:00:00 GMT+0200 (CEST) 

Как вы можете видеть, функция почему-то пропускает понедельник (всего один день).

Пример 2:

x1 = new Date("2015-04-04") //formatted and converted to ms before invoking function 
x2 = new Date("2015-04-10") 

приводит:

Sat Apr 04 2015 12:00:00 GMT+0200 (CEST) 
Sun Apr 05 2015 12:00:00 GMT+0200 (CEST) 
Tue Apr 07 2015 12:00:00 GMT+0200 (CEST) 
Fri Apr 10 2015 12:00:00 GMT+0200 (CEST) 

Как вы можете видеть, что функция как-то скачет понедельник, среда и четверг (3 дня в общей сложности).

Пример 3:

x1 = new Date("2015-04-04") //formatted and converted to ms before invoking function 
x2 = new Date("2015-04-14") 

приводит:

Sat Apr 04 2015 12:00:00 GMT+0200 (CEST) 
Sun Apr 05 2015 12:00:00 GMT+0200 (CEST) 
Tue Apr 07 2015 12:00:00 GMT+0200 (CEST) 
Fri Apr 10 2015 12:00:00 GMT+0200 (CEST) 
Tue Apr 14 2015 12:00:00 GMT+0200 (CEST) 

Как вы можете видеть эту функцию в Thise случае скачет понедельник, среда, четверг, суббота, воскресенье и понедельник (6 дней в итоге).

Пример 4:

x1 = new Date("2015-04-04") //formatted and converted to ms before invoking function 
x2 = new Date("2015-04-08") 

результаты в функции не работает. Похоже, цикл while продолжает работать бесконечно.

Мой вопрос

Что делает сценарий пропускать дни?

+0

Ehm, ваш '$ create_date_array' FUNC ожидает' date' объект, но вы передаете массив ('x1 = [новый Date (" 2015-04- 04")] '). Я что-то упускаю? –

+0

@NikolaDimitroff: функция '$ create_date_array' получает даты в миллисекундах, которые затем преобразуются в дату моей самой функции перед выполнением любых вычислений. Еще одна ошибка заключалась в том, что даты указаны в скобках. Я удалил их. – rabbitco

ответ

7

Рассчитать следующую дату на основе $start_date и counter. Однако в цикле while $start_date переназначается и, следовательно, больше не представляет собой дату начала. Поэтому его не следует увеличивать с помощью counter, но только с одним.

Правильное решение будет:

while ($start_date !== $end_date) { 
    var x = new Date($start_date); 
    x.setDate(x.getDate() + 1); 
    $date_array.push(x); 
    $start_date = x.getTime(); 
} 
+0

О, боже, спасибо @mvdssel. Моя голова болит смотреть на скрипт примерно на 90 минут. Я просто не мог этого видеть! Спасибо огромное! – rabbitco