Compartir a través de


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

Advertencia

La aplicación de escritorio retirada y sin soporte de Internet Explorer 11 ha sido deshabilitada permanentemente a través de una actualización de Microsoft Edge en ciertas versiones de Windows 10. Para obtener más información, consulte Preguntas frecuentes sobre la retirada de la aplicación de escritorio de Internet Explorer 11.

En este artículo se describe el informe de errores al convertir de 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 de KB original: 2410734

Síntomas

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

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

Por ejemplo, al intentar construir una fecha del 17/10/2010 se produce una fecha del 16/10:

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 Date() objeto se inicializa exactamente a la hora en que comienza el DST.

Los valores que se utilizan para construir el objeto Date representan una hora posterior al punto en el que finaliza el horario estándar, pero anterior a la que mostraría un reloj local una vez que ha comenzado el horario de verano. La especificación del lenguaje de la Asociación Europea de Fabricantes de Ordenadores (ECMAScript) especifica que se resta un ajuste de horario de verano de 1 hora al calcular el valor de hora, la representación interna del objeto Date. Sin embargo, esto finalmente representa un momento antes de que comenzara el horario de verano. En el caso de Brasil, esto ocurre a medianoche y, por tanto, el Date objeto termina representando una hora del día anterior.

Solución

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

Cuando solo le preocupan el día, el mes y el año, puede solucionar este comportamiento construyendo objetos de fecha usando un valor de horas que no sea cero y que supere con seguridad el ajuste del horario de verano.

Más información

El estándar ECMAScript se puede encontrar en ECMAScript 2016 Language Specification( Especificación del lenguaje ECMAScript® 2016).

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 de esta conversión es la siguiente:

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

Si sigue este proceso para el inicio del horario de verano, podrá observar cómo se resta una hora. Este ejemplo es para la hora del pacífico, por lo que la fecha real no cambia. 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>