El método getTimezoneOffset()
en JavaScript, en un navegador, devuelve el número de minutos de desplazamiento desde la zona de las 00:00 hora.Por ejemplo, la zona horaria América/Nueva_York en Horario de verano (DST) devuelve el número 300. 300 minutos es una diferencia de 5 horas desde cero. 300 minutos divididos 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
La siguiente cosa que usted debe saber, es que el desplazamiento tiene el signo opuesto de la zona de tiempo real.
Información sobre las zonas de tiempo se mantiene por la Autoridad de Números Asignados de Internet (IANA)
iana time zones
Una tabla de un formato agradable de zonas de horario es suministrada por joda.org
joda-time Time Zones
+00: 00 o Etc/GMT es la hora de Greenwich
Todas las zonas horarias ar e desplazamiento desde +00: 00/"Etc/GMT"/hora de Greenwich
Horario de verano es siempre un momento anterior a la hora "normal" en el verano. Usted establece sus relojes en la temporada de otoño. (Lema "Fall Back" para recordar qué hacer)
Por lo tanto, America/New_York en horario de verano (invierno) es una hora antes del horario habitual. Entonces, por ejemplo, lo que normalmente era a las 5 p.m. por la tarde en la ciudad de Nueva York en el verano, ahora son las 4 p.m. Hora de America/New_York en horario de verano. El nombre "America/New_York" time es un nombre de zona horaria "Long Format". La costa este de EE. UU. Normalmente llama a su zona horaria Eastern Standard Time (EST)
Si desea comparar el desplazamiento de la zona horaria de hoy con el desfase de la zona horaria de alguna otra fecha, necesita saber ese signo matemático (+/- "Positivo/Negativo") del desplazamiento de la zona horaria es el opuesto al huso horario.
Mire la tabla de zonas horarias en joda.org y encuentre la zona horaria para "America/New_York" Tendrá un signo negativo en frente de la compensación estándar.
La tierra gira en sentido antihorario en 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 EE. UU. Verá el amanecer después de que alguien en la costa este de los EE. UU. Vea el amanecer.
Hay una razón por la que necesita saber todo esto. Para que pueda determinar de forma lógica si algún código JavaScript obtiene el estado de DST correctamente o no, sin necesidad de probar cada zona horaria en diferentes momentos 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 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 del desarrollador del navegador?
respuesta es: 240
Por lo tanto, ahora se puede crear una fecha en enero y ver lo que su navegador vuelve 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)
respuesta es: 300
Obviamente 300 es mayor que 240. Por lo tanto, ¿qué significa esto? ¿Debería escribir un código que pruebe que el offset de invierno es más grande que el offset de verano? ¿O el verano compensa menos que el desplazamiento de invierno? Si hay una diferencia entre los desplazamientos de zona horaria de verano y de invierno, puede suponer que se está utilizando el horario de verano para esta zona horaria. Pero eso no le dice si hoy está utilizando DST para la zona horaria de los navegadores. Por lo tanto, deberá obtener la compensación de zona horaria para hoy.
var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();
console.log('todaysTimeZone : ' + todaysTimeZone)
Responder es:? - Depende de la época del año
Si la zona horaria actual offset y el huso horario de verano de desplazamiento es el mismo, Y el tiempo de los desplazamientos de la zona de verano e invierno son diferentes, por deducción lógica, en la actualidad se debe no estar en DST.
¿Puede omitir la comparación de los desplazamientos de zona horaria de verano y de invierno, (saber si se utiliza DST para este huso horario) y simplemente comparar el desplazamiento de zona horaria actual con el desplazamiento de verano TZ y obtener siempre la respuesta correcta?
today's TZ Offset !== Summer TZ Offset
Bueno, ¿hoy es invierno o verano? Si usted supiera que entonces se podría 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 se sabe si la fecha de hoy es en invierno o verano. Cada zona horaria puede tener sus propias reglas para cuando el horario de verano comience y se detenga. Tendría que hacer un seguimiento de las reglas de cada zona horaria para cada zona horaria del mundo. Por lo tanto, si hay una manera mejor y más fácil, entonces también puede hacerlo de la mejor manera y más fácil.
Lo que nos queda es que usted necesita saber si esta zona horaria usa DST, y luego comparar la compensación de la zona horaria de hoy con la compensación 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 utiliza el horario de verano:
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
}
puedo comprobar que esto trabaja a nivel internacional. Actualmente no hay zonas horarias que usen cualquier forma de horario de verano donde tanto el 1 de enero como el 1 de julio estén dentro o fuera del período de horario de verano. Además, en todas las zonas horarias en el TZDB ([con una excepción trivial] (http://en.wikipedia.org/wiki/Antarctica/Casey)) el mayor de los dos desplazamientos es el desplazamiento DST. Dado que el 'getTimezoneOffset' de JavaScript devuelve el valor inverso,' Math.max' devuelve el desplazamiento * estándar *. El código es correcto –
Sin embargo, si alguna zona horaria cambia su definición de modo que tanto el 1 de enero como el 1 de julio son ambos en horario de verano o ambos * no * en horario de verano (y el horario de verano todavía se aplica), este código no funcionaría en esa zona. –
Esto funciona genial. Es realmente agradable poder establecer una constante interna como: 'TIMEZONE_OFFSET = ((new Date()) dst())?'-04: 00': '-05: 00'' – nessur