Este es un poco de mi código JS para el que es necesario:
var secDiff = Math.abs(Math.round((utc_date-this.premiere_date)/1000));
this.years = this.calculateUnit(secDiff,(86400*365));
this.days = this.calculateUnit(secDiff-(this.years*(86400*365)),86400);
this.hours = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)),3600);
this.minutes = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)),60);
this.seconds = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)-(this.minutes*60)),1);
Quiero obtener la fecha y hora en "ago", pero si el horario de verano está en uso, las fechas están apagadas en 1 hora. No sé cómo verificar si el horario de verano está vigente o no.
¿Cómo puedo saber cuándo comienza y termina el horario de verano?
fuente
getTimezoneOffset
devuelve el valor inverso, deMath.max
hecho está devolviendo el desplazamiento estándar . El código es correctoCree dos fechas: una en junio y otra en enero. Compare sus valores getTimezoneOffset ().
Ahora verifique getTimezoneOffset () de la fecha actual.
fuente
Esta respuesta es bastante similar a la respuesta aceptada, pero no anula el
Date
prototipo, y solo usa una llamada de función para verificar si el horario de verano está vigente, en lugar de dos.La idea es que, dado que ningún país observa el horario de verano que dura 7 meses [1] , en un área que observa el horario de verano, la compensación de la hora UTC en enero será diferente a la de julio.
Mientras que el horario de verano se mueve relojes hacia delante , JavaScript siempre devuelve un mayor valor durante la hora estándar. Por lo tanto, obtener la compensación mínima entre enero y julio obtendrá la compensación de zona horaria durante el horario de verano.
Luego verificamos si la zona horaria de fechas es igual a ese valor mínimo. Si es así, entonces estamos en horario de verano; de lo contrario no lo somos.
La siguiente función usa este algoritmo. Toma un objeto de fecha
d
, y regresatrue
si el horario de verano está vigente para esa fecha, yfalse
si no es así:fuente
Math.max(...) != d.get...()
, devolverá verdadero si se observa DST en la zona horaria dada Y la fecha está actualmente en DST. Si no se observa el horario de verano o la fecha coincide con el desplazamiento estándar, devolverá falso.Me enfrenté a este mismo problema hoy, pero dado que nuestro horario de verano comienza y se detiene en diferentes momentos de los EE. UU. (Al menos, según tengo entendido), utilicé una ruta ligeramente diferente.
Luego simplemente compara el desplazamiento de la zona horaria actual con DST y no DST para ver cuál coincide.
fuente
Basado en el comentario de Matt Johanson sobre la solución provista por Sheldon Griffin, creé el siguiente código:
Intenta obtener lo mejor de todos los mundos teniendo en cuenta todos los comentarios y las respuestas sugeridas anteriormente y específicamente:
1) Almacena en caché el resultado de stdTimezoneOffset por año para que no necesite volver a calcularlo al probar varias fechas en el mismo año.
2) No asume que el horario de verano (si es que existe) es necesariamente en julio, y funcionará incluso en algún momento y en algún lugar en cualquier mes. Sin embargo, en cuanto al rendimiento, funcionará más rápido si efectivamente julio (o cerca de meses) son realmente DST.
3) En el peor de los casos, comparará el getTimezoneOffset del primero de cada mes. [y hacer eso una vez por año probado].
La suposición que aún hace es que si hay un período de horario de verano es mayor que un solo mes.
Si alguien quiere eliminar esa suposición, puede cambiar el ciclo a algo más parecido a lo que ofrece la solución proporcionada por Aaron Cole, pero aún así saltaría medio año adelante y saldría del ciclo cuando se encuentran dos compensaciones diferentes]
fuente
La biblioteca moment.js proporciona un
.isDst()
método en sus objetos de tiempo.fuente
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.
¿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.
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.
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?
Bueno, ¿hoy es invierno o verano? Si lo supieras, entonces podrías aplicar la siguiente lógica:
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:
Función para determinar si la zona horaria en el navegador usa DST:
fuente
Use Moment.js ( https://momentjs.com/ )
moment().isDST();
le dará si se observa el ahorro de luz del día.También tiene una función auxiliar para calcular el tiempo relativo para usted. No necesita hacer cálculos manuales, p. Ej.
moment("20200105", "YYYYMMDD").fromNow();
fuente
Estás cerca pero un poco apagado. Nunca necesita calcular su propio tiempo, ya que es el resultado de su propio reloj. Puede detectar si está utilizando el horario de verano en su ubicación, pero no para una ubicación remota producida por el desplazamiento:
Esto seguirá siendo incorrecto y apagado una hora si están en horario de verano. Necesita una cuenta de tiempo remota si están actualmente dentro de su horario de verano o no y ajustar en consecuencia. intente calcular esto y cambie su reloj a - digamos 2/1/2015 y reinicie el reloj una hora como si estuviera fuera del horario de verano. Luego calcule para un desplazamiento para un lugar que todavía debería estar 2 horas atrás. Mostrará una hora antes de la ventana de dos horas. Aún necesitaría tener en cuenta la hora y ajustar. Lo hice para Nueva York y Denver y siempre me equivoco (hora por delante) en Denver.
fuente
Descubrí que usar la biblioteca Moment.js con algunos de los conceptos descritos aquí (en comparación con enero y junio) funciona muy bien.
Esta función simple devolverá si la zona horaria en la que se encuentra el usuario observa el horario de verano:
Una manera simple de verificar que esto funcione (en Windows) es cambiar su zona horaria a una zona que no sea DST, por ejemplo, Arizona devolverá falso, mientras que EST o PST devolverán verdadero.
fuente
Solución a prueba de futuro que funciona en todas las zonas horarias
x
el número esperado de milisegundos en el año de interés sin tener en cuenta el horario de verano.y
el número de milisegundos desde la Época desde el comienzo del año de la fecha de interés.z
el número de milisegundos desde la Época de la fecha y hora de interés completas.t
sea la resta de ambosx
yy
dez
:z - y - x
. Esto produce el desplazamiento debido a DST.t
es cero, entonces el horario de verano no está en vigor. Sit
no es cero, entonces DST está en vigor.Creo que el fragmento de código anterior es superior a todas las otras respuestas publicadas aquí por muchas razones.
Sin embargo, si no se está preparando para más de 2 períodos de horario de verano, entonces el código siguiente se puede usar para determinar si el horario de verano está en vigor como un valor booleano.
fuente
Recientemente necesité crear una cadena de fecha con UTC y DST, y en base a la respuesta de Sheldon puse esto junto:
fuente
¿Hay algún problema al usar el
Date.toString().indexOf('Daylight Time') > -1
"" + new Date()
"" + new Date(...)
Esto parece compatible con todos los navegadores.
fuente
"Thu Jul 02 2020 14:07:01 GMT+0200 (Central European Summer Time)"
Estilo ES6
fuente