javascript - hacer - efecto scroll con imagen de fondo
¿Cómo verificar si el DST(horario de verano) está en efecto y si es cuál es el desplazamiento? (10)
Crea dos fechas: una en junio y otra en enero. Compare sus valores getTimezoneOffset ().
- si el desplazamiento de enero> el desplazamiento de junio, el cliente está en el hemisferio norte
- si enero compensa <desplazamiento de junio, el cliente está en el hemisferio sur
- si no hay diferencia, la zona horaria del cliente no observa DST
Ahora comprueba getTimezoneOffset () de la fecha actual.
- si es igual a junio, hemisferio norte, la zona horaria actual es DST (+1 hora)
- si es igual a enero, hemisferio sur, entonces la zona horaria actual es DST (+1 hora)
Este es un poco de mi código JS para el cual 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 el pasado, pero si el horario de verano está en uso, las fechas están desactivadas en 1 hora. No sé cómo verificar si el horario de verano está en uso o no.
¿Cómo puedo saber cuándo comienza y termina el horario de verano?
Descubrí que el uso de la biblioteca .isDst() con algunos de los conceptos que se describen aquí (que compara Jan con junio) funciona muy bien.
Esta sencilla función devolverá si la zona horaria en la que se encuentra el usuario observa el horario de verano.
function HasDST() {
return moment([2017, 1, 1]).isDST() != moment([2017, 6, 1]).isDST();
}
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.
El método getTimezoneOffset()
en JavaScript, en un navegador, devuelve la cantidad de minutos compensados desde la zona horaria 00:00. 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.
Lo siguiente que debe saber es que el desplazamiento tiene el signo opuesto al huso horario real.
La Autoridad de números asignados de Internet (iana) mantiene la información sobre las zonas horarias
Una tabla muy bien formateada de Time Zones es suministrada por joda.org
+00: 00 o Etc / GMT es la hora de Greenwich
Todas las zonas horarias están desfasadas de +00: 00 / "Etc / GMT" / hora de Greenwich
El horario de verano es siempre más temprano que el horario "regular" 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 time en Daylight Savings (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 es el tiempo de las 4 p. M. De América / New_York en Horario de verano. El nombre "America / New_York" time es un nombre de zona horaria "Long Format". La costa este de los EE. UU. Generalmente llama a su zona horaria Eastern Standard Time (EST)
Si desea comparar el desplazamiento de zona horaria de hoy con el desplazamiento de zona horaria de otra fecha, debe saber que el signo matemático (+/- "Positivo / Negativo") del desplazamiento de zona horaria es el opuesto al huso horario.
Mire la tabla de zona horaria 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 los Estados Unidos 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 cual necesitas 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 han retrocedido 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 las herramientas para desarrolladores del navegador?
La respuesta es: 240
Entonces, ahora puede crear una fecha en enero y ver qué devuelve su navegador para una compensación 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 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á usando 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)
La respuesta es: ? - Depende de la época del año
Si el desplazamiento de la zona horaria de hoy y el desplazamiento de la zona horaria de verano son los mismos, Y las compensaciones de zona horaria de verano y de 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 y de invierno, (saber si se utiliza 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 sabía, 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 usted no 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. Entonces, si hay una manera mejor y más fácil, entonces mejor que lo hagas de la mejor manera.
Lo que nos queda es que 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 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
}
En base al comentario de Matt Johanson sobre la solución provista por Sheldon Griffin, creé el siguiente código:
Date.prototype.stdTimezoneOffset = function() {
var fy=this.getFullYear();
if (!Date.prototype.stdTimezoneOffset.cache.hasOwnProperty(fy)) {
var maxOffset = new Date(fy, 0, 1).getTimezoneOffset();
var monthsTestOrder=[6,7,5,8,4,9,3,10,2,11,1];
for(var mi=0;mi<12;mi++) {
var offset=new Date(fy, monthsTestOrder[mi], 1).getTimezoneOffset();
if (offset!=maxOffset) {
maxOffset=Math.max(maxOffset,offset);
break;
}
}
Date.prototype.stdTimezoneOffset.cache[fy]=maxOffset;
}
return Date.prototype.stdTimezoneOffset.cache[fy];
};
Date.prototype.stdTimezoneOffset.cache={};
Date.prototype.isDST = function() {
return this.getTimezoneOffset() < this.stdTimezoneOffset();
};
Trata de 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 por año de stdTimezoneOffset para que no tenga que volver a calcularlo cuando pruebe varias fechas en el mismo año.
2) No supone que el horario de verano (si es que existe) es necesariamente en julio, y funcionará incluso si en algún momento y en algún lugar sea cualquier mes. Sin embargo, en cuanto a rendimiento, funcionará más rápido si, de hecho, julio (o cerca de meses) son realmente DST.
3) Peor aún, 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 el período de DST es más grande que un solo mes.
Si alguien quiere eliminar esa suposición, puede cambiar el bucle a algo más parecido a lo que está en la solución provista por Aaron Cole, pero aún así saltaría medio año antes y saldrá del ciclo cuando se encuentren dos compensaciones diferentes.
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á usando el horario de verano en su ubicación, pero no para una ubicación remota producida por el desplazamiento:
newDateWithOffset = new Date(utc + (3600000*(offset)));
Esto seguirá siendo incorrecto y en 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 ajuste en consecuencia. intente calcular esto y cambie su reloj a - digamos 2/1/2015 y restablezca el reloj una hora atrás como fuera del horario de verano. Luego calcule para una compensación para un lugar que aún debe estar 2 horas atrás. Aparecerá 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 voy mal (hora adelante) en Denver.
Este código utiliza el hecho de que getTimezoneOffset
devuelve un valor mayor durante el horario estándar frente al horario de verano (DST). Por lo tanto, determina la salida esperada durante la Hora estándar, y compara si la salida de la fecha dada es igual (Estándar) o menos (DST).
Tenga en cuenta que getTimezoneOffset
devuelve números positivos de minutos para las zonas al oeste de UTC, que generalmente se indican como horas negativas (ya que están "detrás" de UTC). Por ejemplo, Los Angeles es UTC-8h Standard, UTC-7h DST. getTimezoneOffset
devuelve 480
(480 minutos positivos) en diciembre (invierno, hora estándar), en lugar de -480
. Devuelve números negativos para el Hemisferio Oriental (por ejemplo, -600
para Sydney en invierno, a pesar de estar "adelante" ( UTC + 10h ).
Date.prototype.stdTimezoneOffset = function () {
var jan = new Date(this.getFullYear(), 0, 1);
var jul = new Date(this.getFullYear(), 6, 1);
return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
}
Date.prototype.isDstObserved = function () {
return this.getTimezoneOffset() < this.stdTimezoneOffset();
}
var today = new Date();
if (today.isDstObserved()) {
alert ("Daylight saving time!");
}
Hace poco tuve que crear una cadena de fecha con UTC y DST, y en base a la respuesta de Sheldon puse esto en conjunto:
Date.prototype.getTimezone = function(showDST) {
var jan = new Date(this.getFullYear(), 0, 1);
var jul = new Date(this.getFullYear(), 6, 1);
var utcOffset = new Date().getTimezoneOffset() / 60 * -1;
var dstOffset = (jan.getTimezoneOffset() - jul.getTimezoneOffset()) / 60;
var utc = "UTC" + utcOffset.getSign() + (utcOffset * 100).preFixed(1000);
var dst = "DST" + dstOffset.getSign() + (dstOffset * 100).preFixed(1000);
if (showDST) {
return utc + " (" + dst + ")";
}
return utc;
}
Number.prototype.preFixed = function (preCeiling) {
var num = parseInt(this, 10);
if (preCeiling && num < preCeiling) {
num = Math.abs(num);
var numLength = num.toString().length;
var preCeilingLength = preCeiling.toString().length;
var preOffset = preCeilingLength - numLength;
for (var i = 0; i < preOffset; i++) {
num = "0" + num;
}
}
return num;
}
Number.prototype.getSign = function () {
var num = parseInt(this, 10);
var sign = "+";
if (num < 0) {
sign = "-";
}
return sign;
}
document.body.innerHTML += new Date().getTimezone() + "<br>";
document.body.innerHTML += new Date().getTimezone(true);
<p>Output for Turkey (UTC+0200) and currently in DST: UTC+0300 (DST+0100)</p>
<hr>
Me enfrenté hoy con el mismo problema, pero dado que nuestro horario de verano se inicia y se detiene en diferentes momentos desde los EE. UU. (Al menos desde mi entendimiento), utilicé una ruta ligeramente diferente.
var arr = [];
for (var i = 0; i < 365; i++) {
var d = new Date();
d.setDate(i);
newoffset = d.getTimezoneOffset();
arr.push(newoffset);
}
DST = Math.min.apply(null, arr);
nonDST = Math.max.apply(null, arr);
Luego simplemente compara la compensación actual de la zona horaria con DST y sin DST para ver cuál coincide.
Ya lo resolvió, pero pensé que debería agregar la forma en que lo hago (en caso de que las personas estén interesadas).
function isDST(t) { //t is the date object to check, returns true if daylight saving time is in effect.
var jan = new Date(t.getFullYear(),0,1);
var jul = new Date(t.getFullYear(),6,1);
return Math.min(jan.getTimezoneOffset(),jul.getTimezoneOffset()) == t.getTimezoneOffset();
}
Funciona de la misma manera que la respuesta exceptuada (janurary y july timezone offset), luego devuelve el condicional.