El getTimezoneOffset()
método en JavaScript, en un navegador, devuelve el número de minutos compensados desde la zona horaria 00:00. Por ejemplo, la zona horaria América / Nueva_York en el horario de verano (DST) devuelve el número 300. 300 minutos es 5 horas de diferencia desde cero. 300 minutos dividido por 60 minutos son 5 horas. Cada zona horaria se compara con la zona horaria cero, +00: 00 / Etc / GMT / hora de Greenwich.
MDN Web Docs
Lo siguiente que debe saber es que el desplazamiento tiene el signo opuesto de la zona horaria real.
La Autoridad de Números Asignados de Internet (iana) mantiene información sobre las zonas horarias.
zonas horarias de iana
Joda.org proporciona una tabla de zonas horarias con un formato agradable
zonas horarias de tiempo joda
+00: 00 o Etc / GMT es hora de Greenwich
Todas las zonas horarias están compensadas desde +00: 00 / "Etc / GMT" / hora de Greenwich
El horario de verano es siempre un horario anterior al horario "regular" del verano. Regresaste tus relojes en la temporada de otoño. (Lema "Fall Back" para recordar qué hacer)
Entonces, el horario de América / Nueva_York en el horario de verano (invierno) es una hora antes del horario normal. Entonces, por ejemplo, lo que normalmente era las 5 pm de la tarde en la ciudad de Nueva York en el verano, ahora son las 4 pm, hora de América / Nueva York en el horario de verano. El nombre de la hora "América / Nueva_York" es un nombre de zona horaria de "Formato largo". La costa este de los EE. UU. Generalmente llama a su zona horaria Hora estándar del este (EST)
Si desea comparar el desplazamiento de la zona horaria actual con el desplazamiento de la zona horaria de otra fecha, debe saber que el signo matemático (+/- "Positivo / Negativo") del desplazamiento de la zona horaria es el opuesto de la zona horaria.
Mire la tabla de zonas horarias en joda.org y encuentre la zona horaria para "América / Nueva_York". Tendrá un signo negativo frente a la compensación estándar.
La tierra gira en sentido antihorario sobre su eje. Una persona que mira el amanecer en Greenwich ve el amanecer 5 horas antes de que alguien en la ciudad de Nueva York vea el amanecer. Y alguien en la costa oeste de los Estados Unidos verá el amanecer después de que alguien en la costa este de los Estados Unidos vea el amanecer.
Hay una razón por la que necesitas saber todo esto. Para que pueda determinar lógicamente si algún código JavaScript obtiene el estado de DST correctamente o no, sin necesidad de probar cada zona horaria en diferentes épocas del año.
Imagine que es noviembre en la ciudad de Nueva York, y los relojes se han retrasado una hora. En el verano en la ciudad de Nueva York, el desplazamiento es de 240 minutos o 4 horas.
Puede probar esto creando una fecha que sea en julio y luego obteniendo el desplazamiento.
var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
¿Qué se imprimirá en el registro de la consola de herramientas de desarrollo del navegador?
La respuesta es: 240
Entonces, ahora puede crear una fecha en enero y ver qué devuelve su navegador para un desplazamiento de zona horaria para la temporada de invierno.
var Jan_Date = new Date(2017, 0, 1);//Month is zero indexed - Jan is zero
var jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();
console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)
La respuesta es: 300
Obviamente 300 es más grande que 240. Entonces, ¿qué significa esto? ¿Debería escribir un código que pruebe que la compensación de invierno sea mayor que la compensación de verano? ¿O la compensación de verano menos que la compensación de invierno? Si hay una diferencia entre las compensaciones de zona horaria de verano e invierno, entonces puede suponer que se está utilizando DST para esta zona horaria. Pero eso no le dice si hoy está usando DST para la zona horaria de los navegadores. Por lo tanto, deberá obtener el desplazamiento de zona horaria para hoy.
var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();
console.log('todaysTimeZone : ' + todaysTimeZone)
La respuesta es: ? - Depende de la época del año.
Si el desplazamiento de zona horaria de hoy y el desplazamiento de zona horaria de verano son iguales, Y las compensaciones de zona horaria de verano e invierno son diferentes, entonces, por deducción lógica, hoy NO debe estar en DST.
¿Puede omitir la comparación de las compensaciones de zona horaria de verano e invierno (para saber si se usa DST para esta zona horaria) y simplemente comparar la compensación de zona horaria de hoy con la compensación de TZ de verano y obtener siempre la respuesta correcta?
today's TZ Offset !== Summer TZ Offset
Bueno, ¿hoy es invierno o verano? Si lo supieras, entonces podrías aplicar la siguiente lógica:
if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
Pero el problema es que no sabes si la fecha de hoy es invierno o verano. Cada zona horaria puede tener sus propias reglas para cuando el horario de verano comienza y se detiene. Debería realizar un seguimiento de las reglas de cada zona horaria para cada zona horaria del mundo. Entonces, si hay una manera mejor y más fácil, entonces también podrías hacerlo de la mejor manera y más fácil.
Lo que nos queda es que necesita saber si esta zona horaria usa DST y luego comparar el desplazamiento de la zona horaria de hoy con el desplazamiento de la zona horaria de verano. Eso siempre te dará una respuesta confiable.
La lógica final es:
if ( DST_Is_Used_In_This_Time_Zone && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
Función para determinar si la zona horaria en el navegador usa DST:
function is_DST_Used_In_This_TimeZone() {
var Jan_Date, jan_Timezone_OffSet, July_Date, july_Timezone_OffSet
offsetsNotEqual, thisYear, today;
today = new Date();//Create a date object that is now
thisYear = today.getFullYear();//Get the year as a number
Jan_Date = new Date(thisYear, 0, 1);//Month is zero indexed - Jan is zero
jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();
console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)
July_Date = new Date(thisYear, 6, 1);
july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
offsetsNotEqual = july_Timezone_OffSet !== jan_Timezone_OffSet;//True if not equal
console.log('offsetsNotEqual: ' + offsetsNotEqual);
return offsetsNotEqual;//If the offsets are not equal for summer and
//winter then the only possible reason is that DST is used for
//this time zone
}
getTimezoneOffset
devuelve el valor inverso, deMath.max
hecho está devolviendo el desplazamiento estándar . El código es correcto