2015-05-21 10 views
6

Informacje dodatkoweChoć licznik pętli zwiększenie „geometrycznym” pomimo stosowania ++

ja powołującą funkcję, która tworzy tablicę datę w oparciu o datę rozpoczęcia i datę zakończenia.

Funkcja otrzyma datę rozpoczęcia i zakończenia, które zostały najpierw sformatowane do formatu year-month-dayT12:00:00:00, a następnie przekształcone na milisekundy w formacie .getTime().

Mój skrypt

zrobiłem następujący skrypt, aby utworzyć tablicę.

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); 
} 

Należy pamiętać, że nie ma powodu do zagnieżdżania funkcji $create_date_array wewnątrz funkcji $calc_workdays_between_dates. Na razie usunąłem wszystkie inne części funkcji $calc_workdays_between_dates, aby skupić się wyłącznie na problemie (prowadzę również testy na tej rozebranej wersji - więc reszta funkcji nie ma wpływu na cokolwiek).

Mój problem

Przykład 1:

Gdybym wywołać funkcję z calc_workdays_between_dates (x1, x2); gdzie:

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

to skutkuje $date_array się następującą treść:

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) 

Jak widać funkcja z jakiegoś powodu pomija poniedziałek (łącznie jeden dzień).

Przykład 2:

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

skutkuje:

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) 

Jak widać funkcja jakoś pomija poniedziałek, środę i czwartek (3 dni w sumie).

Przykład 3:

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

skutkuje:

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) 

Jak widać funkcję w THISE przykład pomija poniedziałek, środa, czwartek, sobota, niedziela i poniedziałek (6 dni razem).

Przykład 4:

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

wyniki w funkcji nie działa. Wygląda na to, że pętla while nadal działa bez końca.

Moje pytanie

Co robi skrypt pominąć dni?

+0

Ehm, twój '$ create_date_array' func oczekuje' dzień spełnienia wymogu obiekt, ale są przechodzącą tablicę ('x1 = [new Date (" 2015-04- 04 ")]'). Czy czegoś brakuje? –

+0

@NikolaDimitroff: Funkcja '$ create_date_array' odbiera daty w milisekundach, które są następnie konwertowane do daty mojej funkcji przed wykonaniem jakichkolwiek obliczeń. Kolejny błąd pojawił się w nawiasach. Usunąłem je. – rabbitco

Odpowiedz

7

Obliczasz następną datę na podstawie $start_date i counter. Jednak w pętli while $start_date jest ponownie przypisywany, a zatem nie jest już datą rozpoczęcia. Dlatego nie powinno być zwiększane o counter, ale tylko z jednym.

Prawidłowe rozwiązanie byłoby:

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

O mój boże - dziękuję @mvdssel. Moja głowa boli od wpatrywania się w scenariusz przez około 90 minut. Po prostu nie mogłem tego zobaczyć! Dziękuję bardzo! – rabbitco