¿Cómo comprobar si el horario de verano (DST) está vigente y, de ser así, el desplazamiento?
Este es un fragmento de mi código JS para el cual se necesita:
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 "hace", pero si el horario de verano está en uso, las fechas tienen un desfase de 1 hora. No sé cómo comprobar si el horario de verano está vigente o no.
¿Cómo puedo saber cuándo comienza y termina el horario de verano?
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 la misma (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 Ángeles tiene UTC–8h estándar, UTC-7h DST. getTimezoneOffset
regresa 480
(480 minutos positivos) en diciembre (invierno, hora estándar), en lugar de -480
. Arroja números negativos para el hemisferio oriental (como -600
Sydney en invierno, a pesar de estar "por delante" ( 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!");
}
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 un horario de verano que dure siete meses [1] , en un área que observa el horario de verano el desplazamiento de la hora UTC en enero será diferente al de julio.
Mientras que el horario de verano adelanta los relojes , JavaScript siempre devuelve un valor mayor durante el horario estándar. Por lo tanto, al obtener la compensación mínima entre enero y julio, la zona horaria se compensará durante el horario de verano.
Luego verificamos si la zona horaria de las 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 utiliza este algoritmo. Toma un objeto de fecha d
y lo devuelve true
si el horario de verano está vigente para esa fecha y, false
si no lo está:
function isDST(d) {
let jan = new Date(d.getFullYear(), 0, 1).getTimezoneOffset();
let jul = new Date(d.getFullYear(), 6, 1).getTimezoneOffset();
return Math.max(jan, jul) !== d.getTimezoneOffset();
}