Error en el valor date al principio de DST en determinadas zonas horarias

Importante

La aplicación de escritorio Internet Explorer 11 está retirada y sin soporte a partir del 15 de junio de 2022 para determinadas versiones de Windows 10.

Todavía puede acceder a sitios antiguos heredados que requieren Internet Explorer con el modo Internet Explorer en Microsoft Edge. Obtenga más información.

La aplicación de escritorio Internet Explorer 11 se redirigirá progresivamente al explorador Microsoft Edge, más rápido y seguro. En última instancia, se deshabilitará a través de Windows Update. Deshabilite IE hoy.

En este artículo se describe el informe de errores al convertir de la hora estándar al horario de verano (DST) y se proporciona una solución.

Versión del producto original:   Internet Explorer 11, Internet Explorer 10, Internet Explorer 9
Número KB original:   2410734

Síntomas

Cuando se usa el objeto para calcular fechas en determinadas circunstancias, los usuarios pueden ver JavaScript Date resultados aparentemente incorrectos. Este comportamiento se produce cuando se cumplen las siguientes condiciones:

  • La zona horaria configurada en Fecha y hora Configuración de la hora estándar a DST a medianoche.
  • La aritmética de fecha usa objetos sin horas y minutos (o horas y minutos con 0) y solo usa fechas que se transiciónn de hora Date estándar a DST.

Por ejemplo, al intentar construir una fecha del 10/17/2010 se produce una fecha del 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

Se trata de una instancia específica de un problema que se produce cuando un objeto se inicializa exactamente en el momento en Date() que comienza el DST.

Los valores que se usan para construir el objeto representan una hora después del punto en el que finaliza la hora estándar, pero antes de que un reloj local se mostraría después de que Date DST haya comenzado. La especificación european computer manufacturers Association Script (ECMAScript) Language especifica que se resta un ajuste DST de 1 hora al calcular el valor de hora, la representación interna del Date objeto. Sin embargo, esto termina representando un tiempo antes de que DST comenzara. En el caso de Brasil, esto ocurre a medianoche y, por lo tanto, el objeto termina representando una hora del Date día anterior.

Solución

Este comportamiento se ajusta al estándar ECMAScript y, por lo tanto, es por diseño.

Cuando solo le preocupa el día, el mes y el año, puede evitar este comportamiento mediante la construcción de objetos de fecha mediante un valor de horas que no sea cero, es decir, un valor de horas que sea más grande que el ajuste de horario de verano.

Más información

El estándar ECMAScript puede encontrarse en ECMAScript ® 2016 Language Specification.

La sección 20.3.2 define cómo se interpreta el constructor Date, incluido el hecho de una conversión de un valor de hora a hora universal coordinada (UTC).

La sección 20.3.1.10 define las conversiones entre la hora local y la hora UTC y indica que estas conversiones no son necesariamente inversas entre sí.

La fórmula para esta conversión es la siguiente:

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

Si lo sigues para el inicio de DST, puedes ver cómo se resta la hora. Este ejemplo es para la hora del pacífico, por lo que no se cambia la fecha real. Comience por:

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>