Condividi tramite


Errore nel valore di data all'inizio di DST in determinati fusi orari

Avviso

L'applicazione desktop Internet Explorer 11, ritirata e fuori supporto, è stata disabilitata in modo permanente tramite un aggiornamento di Microsoft Edge su alcune versioni di Windows 10. Per altre informazioni, vedere Domande frequenti sul ritiro delle app desktop di Internet Explorer 11.

Questo articolo descrive il report degli errori durante la conversione dall'ora solare all'ora legale (DST) e fornisce una soluzione.

Versione originale del prodotto: Internet Explorer 11, Internet Explorer 10, Internet Explorer 9
Numero KB originale: 2410734

Sintomi

Quando si usa l'oggetto JavaScript Date per calcolare le date in determinate circostanze, gli utenti potrebbero visualizzare risultati apparentemente errati. Questo comportamento si verifica quando le condizioni seguenti sono vere:

  • Il fuso orario configurato in Impostazioni di data e ora passa dall'ora standard all'ora legale a mezzanotte.
  • L'aritmetica della data usa Date oggetti senza ore e minuti (o ore e minuti usando 0) e usa solo le date che passano dall'ora standard all'ora DST.

Ad esempio, il tentativo di costruire una data 10/17/2010 restituisce una data di 10/16:

var dt = new Date(2010, 9,17);
// ...
console.log(dt.toString()); // evaluates to 'Sat Oct 16 23:00:00 UTC-0300 2010'
dt.getDate(); // evaluates to 16

Causa

Si tratta di un'istanza specifica di un problema che si verifica quando un Date() oggetto viene inizializzato esattamente all'ora di inizio dell'ora legale.

I valori utilizzati per costruire l'oggetto rappresentano un momento successivo al termine dell'ora solare, ma precedente a quanto mostrerebbe un orologio locale dopo l'inizio dell'ora legale. La specifica del linguaggio ECMAScript (European Computer Manufacturers Association Script) definisce che una regolazione dell'ora legale di 1 ora viene sottratta durante il calcolo del valore temporale, che è la rappresentazione interna dell'oggetto Date. Tuttavia, questo finisce per rappresentare un'ora prima dell'inizio dell'ora legale. Nel caso del Brasile, questo si verifica a mezzanotte e quindi l'oggetto Date finisce per rappresentare un'ora del giorno precedente.

Risoluzione

Questo comportamento è conforme allo standard ECMAScript ed è quindi progettato.

Quando si è interessati solo al giorno, al mese e all'anno, è possibile aggirare questo comportamento creando oggetti data utilizzando un valore di ore che non sia zero, ovvero un valore di ore che superi in modo sicuro l'adattamento dell'ora legale.

Ulteriori informazioni

Lo standard ECMAScript è disponibile in ECMAScript 2016 Language Specification.The ECMAScript standard can be found at ECMAScript® 2016 Language Specification.

La sezione 20.3.2 definisce il modo in cui viene interpretato il costruttore Date, incluso il fatto di una conversione di un valore di ora in utc (Coordinated Universal Time).

La sezione 20.3.1.10 definisce le conversioni tra l'ora locale e l'ora UTC e indica che queste conversioni non sono necessariamente inverse tra loro.

La formula per questa conversione è la seguente:

UTC( t ) = t - LocalTZA - DaylightSavingTA(t - LocalTZA)

Se si segue questa procedura per l'inizio dell'ora DST, è possibile vedere come viene sottratta l'ora. Questo esempio è relativo all'ora pacifico, quindi la data effettiva non viene modificata. Iniziare con:

t = <Sun Mar 13 02:00:00 Pacific 2011>
LocalTZA = -8
The expression t - LocalTZA occurs twice in this equation; it evaluates to <Sun Mar 13 10:00:00 UTC 2011>. This is the exact moment when DST starts in the Pacific time zone. This is the key fact during conversion of this time to UTC:
UTC( <Sun Mar 13 02:00:00 Pacific 2011> )
= <Sun Mar 13 02:00:00 Pacific 2011> - LocalTZA - DaylightSavingTA( <Sun Mar 13 02:00:00 Pacific 2011> - LocalTZA )
= <Sun Mar 13 10:00:00 UTC 2011> -DaylightSavingTA( <Sun Mar 13 10:00:00 UTC 2011> )
= <Sun Mar 13 10:00:00 UTC 2011>- 1
= <Sun Mar 13 9:00:00 UTC 2011>