2015-04-17 14 views
18

La prova:Come spiegare la differenza nel costruttore Date?

var d1 = new Date("2000-04-22T00:00:00+00:00"); 
var d2 = new Date(2000, 4, 22, 0, 0, 0, 0); 
console.log("d1 = " + d1.getTime()); 
console.log("d2 = " + d2.getTime()); 

Il risultato:

d1 = 956361600000 
d2 = 958946400000 

Penso che la differenza viene da fusi orari, ma non capisco affatto!

Quali cose magiche producono questa differenza?

+2

Questo sarebbe a causa del vostro fuso orario – epascarello

+2

Usa 'new Date (Date.UTC (2000, 4, 22, 0, 0, 0, 0)); 'per ottenere il risultato previsto. – Bergi

+0

Che risolve il problema UTC, con l'indice del mese giusto diventa 'new Date (Date.UTC (2000, 3, 22, 0, 0, 0, 0));' e funziona! –

risposta

12

Il problema più grande è che i mesi sono 0 indicizzati in Javascript, nel creare la seconda istanza data, il 4 significa maggio. Inoltre, la stringa include +00: 00 per gli scopi del fuso orario, ovvero UTC/GMT. Il secondo non fornisce informazioni sul fuso orario, quindi sarà il fuso orario locale.

Se si desidera una data UTC costruito simile a come l'avevi, è possibile chiamare:

var d2 = new Date(Date.UTC(2000, 3, 22, 0, 0, 0, 0)); 
+0

'UTC' non è un costruttore – Bergi

+0

Grazie, riparato, dimenticato di avvolgere in Data. – JBzd

19

La stringa di data ISO ha un fuso orario UTC esplicito, quindi è interpretato come UTC. La seconda data viene costruita con parametri numerici per le parti di data e questo metodo di costruzione di una data utilizza implicitamente il fuso orario locale.

Si noti inoltre che il "4" nella stringa di data significa "Aprile", mentre "4" nel secondo costruttore significa "Maggio": quando si utilizza il costruttore numerico, i mesi sono numerati a partire da zero, non uno.

+1

Ci vediamo di nuovo, e tu sei * ancora * fantastico. –

4

Penso che questo sia migliore described in the documentation:

Nota: Dove Data si chiama come un costruttore con più di un argomento, gli argomenti specifed rappresentano ora locale. Se si desidera UTC, utilizzare la nuova data (Date.UTC (...)) con gli stessi argomenti.

In altre parole, quando si utilizza il costruttore di stringhe, si ottiene UTC. Quando ne crei uno usando la funzione di costruzione, ottieni le impostazioni locali normali.

Problemi correlati