¿Cómo comprobar si el horario de verano (DST) está vigente y, de ser así, el desplazamiento?

Resuelto Jo Smo asked hace 12 años • 17 respuestas

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?

Jo Smo avatar Aug 09 '12 23:08 Jo Smo
Aceptado

Este código utiliza el hecho de que getTimezoneOffsetdevuelve 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 getTimezoneOffsetdevuelve 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. getTimezoneOffsetregresa 480(480 minutos positivos) en diciembre (invierno, hora estándar), en lugar de -480. Arroja números negativos para el hemisferio oriental (como -600Sydney 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!");
}
Sheldon Griffin avatar Aug 09 '2012 17:08 Sheldon Griffin

Esta respuesta es bastante similar a la respuesta aceptada, pero no anula el Dateprototipo 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 dy lo devuelve truesi el horario de verano está vigente para esa fecha y, falsesi 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();    
}
toastrackengima avatar May 16 '2015 20:05 toastrackengima