2015-10-28 16 views
5

Sto lavorando a un'applicazione in cui tutte le date utilizzate sono date GMT arrotondate, ad es. 2015-10-29T00:00:00.000Z.Aggiungere giorni a una data senza modificare l'ora GMT

sto usando la funzione seguente per aggiungere giorni a una data:

function addDays(date, days) { 
    var result = new Date(date); 
    result.setDate(result.getDate() + days); 
    return result; 
} 

Ma, ho appena realizzato che non funziona quando si attraversa l'ora legale il giorno che cambia:

var myDate = new Date('2015-10-24T00:00:00.000Z'); 
for(i = 0; i<4; i++) { 
    console.log(JSON.stringify(myDate)); 
    myDate = addDays(myDate, 1); 
} 

Risulterà :

"2015-10-24T00:00:00.000Z" 
"2015-10-25T00:00:00.000Z" 
"2015-10-26T01:00:00.000Z" 
      ^
"2015-10-27T01:00:00.000Z" 
      ^

Si noti che le ultime due date non sono più arrotondate.

Qual è il modo corretto per affrontare questo?

+0

Utilizzare http://www.datejs.com è molto potente e gestisce la maggior parte degli scenari. –

risposta

0

Il problema è che Date.setDate() aggiunge un giorno senza modificare il locale tempo. Ma questo significa che il tempo GMT cambia!

Utilizzando Date.setUTCDate() risolve il problema:

function addUTCDays(date, days) { 
    var result = new Date(date); 
    result.setUTCDate(result.getUTCDate() + days); 
    //  ^^^    ^^^ 
    return result; 
} 

Poi:

var myDate = new Date('2015-10-24T00:00:00.000Z'); 
for(i = 0; i<4; i++) { 
    console.log(JSON.stringify(myDate)); 
    myDate = addUTCDays(myDate, 1); 
} 

Risulterà:

"2015-10-24T00:00:00.000Z" 
"2015-10-25T00:00:00.000Z" 
"2015-10-26T00:00:00.000Z" 
"2015-10-27T00:00:00.000Z" 

Ciò funzionerà anche per mesi:

function addMonths(date, months) { 
    var result = new Date(date); 
    result.setUTCMonth(result.getUTCMonth() + months); 
    return result; 
} 
3

Modifica: In realtà ho trovato una soluzione che è decisamente migliore. Sto lasciando questo per ragioni di esaustività.

Il problema è che Date.setDate() aggiunge un giorno senza modificare il tempo locale. Ma questo significa che il tempo GMT cambia!

L'aggiunta di un giorno senza cambiare l'ora GMT è in realtà semplice come l'aggiunta di 24 * 3600 * 1000 millisecondi in volta della data:

function addGMTDays(date, days) { 
    var result = new Date(date); 
    result.setTime(result.getTime() + days * 24 * 3600 * 1000); 
    return result; 
} 

Poi:

var myDate = new Date('2015-10-24T00:00:00.000Z'); 
for(i = 0; i<4; i++) { 
    console.log(JSON.stringify(myDate)); 
    myDate = addGMTDays(myDate, 1); 
} 

Risulterà:

"2015-10-24T00:00:00.000Z" 
"2015-10-25T00:00:00.000Z" 
"2015-10-26T00:00:00.000Z" 
"2015-10-27T00:00:00.000Z" 
+0

Ho dovuto convertire i valori interi in LUNGO per evitare i troncamenti –

Problemi correlati