2010-11-05 15 views
7

Ho una sezione di Javascript semplice nella mia applicazione che ha un collegamento "Aggiungi giorno", che aggiunge 1 giorno a una data. Funziona sempre perfettamente, tranne quando la data sarà 11/07/2010, e quindi il link improvvisamente non funzionerà più. È davvero strano, perché si blocca solo alla data specifica dell'11/07/2010.data JavaScript, è questo il mio errore o ho trovato un bug?

come riprodurre l'errore:

  1. Accedere alla pagina here
  2. In qualsiasi campo della data, fare clic su "Oggi", o semplicemente impostare la data di oggi.
  3. Fare clic su "Aggiungi giorno" fino all'11/07/2010
  4. Ora fare clic su "Aggiungi giorno" non funziona più!
+0

per me su Chrome. Sembra funzionare bene. – harpo

+1

Funziona per me (FF 3.6.12). Quale browser? –

+0

Funziona per me. Quale browser utilizzate? Potresti essere morso da un errore di calcolo dell'ora legale? –

risposta

13

Il problema è che si aggiungono le 24 ore alla data per aggiungere un giorno; L'ora legale ti ha ostacolato perché 24 ore dopo le 00:00 del 7 novembre saranno le 23:00 (per la seconda volta) il 7 novembre.

+0

E, naturalmente, questo comportamento dipenderà dal fatto che Daylight Savings Time termina il 7 novembre nelle impostazioni locali in cui è in esecuzione il browser. –

+1

Bella cattura. Sono in AZ - non abbiamo il DST qui :) –

+0

+1 perché digito lentamente: \ – Angiosperm

1

Ora legale. (Nella maggior parte dei posti negli Stati Uniti) il tempo scorre indietro la prima domenica di novembre. Il tuo codice aggiunge semplicemente una quantità di millisecondi all'inizio del giorno specificato dalla casella di input e restituisce l'inizio del giorno risultante: tuttavia, a causa dell'ora legale, semplicemente aggiungendo secondi e troncando la data in questo modo non avanzi mai la data .

3

Altri hanno individuato il problema.

Per risolvere il problema è possibile utilizzare il sovraccarico Date costruttore che accetta l'anno, mese e giorno:

var aDate = new Date(2010, 10, 07); 
var aDatePlusOneDay = new Date(aDate.getFullYear(), 
           aDate.getMonth(), 
           aDate.getDate() + 1, // HERE 
           aDate.getHours(), 
           aDate.getMinutes(), 
           aDate.getSeconds(), 
           aDate.getMilliseconds()); 

Ecco una soluzione più generico che può incrementare qualsiasi data da una data quantità millisecondo, prendendo modifiche legale in considerazione:

Date.addTicks = function(date, ticks) { 
    var newDate = new Date(date.getTime() + ticks); 
    var tzOffsetDelta = newDate.getTimezoneOffset() - date.getTimezoneOffset(); 
    return new Date(newDate.getTime() + tzOffsetDelta * 60000); 
} 

aggiunta al giorno per un oggetto Date poi è una questione di aggiungere il numero di millisecondi in un giorno:

Date.addTicks(new Date(2010, 10, 7), 86400000); // new Date(2010, 10, 8) 

Riferimenti:

Non
Problemi correlati