2015-05-21 17 views
6

Informazioni diMentre contatore di ciclo aumentando "in modo esponenziale" nonostante utilizzando ++

Sto installando una funzione che crea una matrice data sulla base di una data di inizio e una data di fine.

La funzione riceverà le date di inizio e di fine, che sono state formattate per la prima volta nel formato year-month-dayT12:00:00:00 e quindi convertite in millisecondi con il formato .getTime().

Il mio script

ho fatto il seguente script per creare l'array.

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

Si prega di essere consapevole del fatto che c'è una ragione per la nidificazione della funzione $create_date_array all'interno della funzione $calc_workdays_between_dates. Per ora ho eliminato tutte le altre parti della funzione $calc_workdays_between_dates per concentrarmi esclusivamente sul problema in questione (sto anche eseguendo i miei test su questa versione ridotta - quindi il resto della funzione non è lì per influenzare nulla).

Il mio problema

Esempio 1:

Se invoco la funzione con calc_workdays_between_dates (x1, x2); dove:

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

si traduce in $date_array ottenere il seguente contenuto:

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) 

Come si può vedere la funzione per qualche motivo salta lunedì (un giorno in totale).

Esempio 2:

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

risultati in:

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) 

Come si può vedere la funzione salta qualche modo Lunedi, Mercoledì e Giovedi (3 giorni in totale).

Esempio 3:

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

risultati in:

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) 

Come si può vedere la funzione a Thise esempio salta Lunedi, Mercoledì, Giovedi, Sabato, Domenica e Lunedi (6 giorni in totale).

Esempio 4:

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

risultati in funzione non funzionante. Sembra che il ciclo while continui a girare all'infinito.

La mia domanda

cosa sta facendo lo script saltare giorni?

+0

Ehm, il vostro 'func $ create_date_array' si aspetta un' date' oggetto, ma si sta passando un array ('x1 = [new Date (" 2015-04- 04")] '). Mi sto perdendo qualcosa? –

+0

@NikolaDimitroff: la funzione '$ create_date_array' riceve le date in millisecondi che vengono poi convertite in una data mia funzione prima di eseguire qualsiasi calcolo. Era un altro errore che le date appaiono tra parentesi. Li ho cancellati – rabbitco

risposta

7

Si calcola la data successiva in base a $start_date e counter. Tuttavia, nel ciclo while $start_date viene riassegnato e quindi non rappresenta più la data di inizio. Pertanto non dovrebbe essere incrementato con counter, ma solo con uno.

Una soluzione corretta sarebbe:

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

Oh mio Dio - grazie @mvdssel. La mia testa è dolorante dal fissare la sceneggiatura per circa 90 minuti ormai. Non potevo vederlo! Grazie mille! – rabbitco

Problemi correlati