如何检查DST(夏令时)是否有效,如果是,偏移量?

这是我的一些JS代码,需要这样做:

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);

我想以“ago”获取日期时间,但如果正在使用DST,则日期相差1小时。我不知道如何检查DST是否有效。

我如何知道夏令时何时开始和结束?


答案 1

此代码使用的事实是在标准时间与夏令时 (DST) 相比返回更大的值。因此,它确定标准时间期间的预期输出,并比较给定日期的输出是相同(标准)还是更少(DST)。getTimezoneOffset

请注意,对于 UTC 以西的区域,返回分钟数,这些区域通常表示为小时数(因为它们“落后于”UTC)。例如,洛杉矶是 UTC–8h 标准,UTC-7h DST。 在 12 月(冬季,标准时间)返回(正 480 分钟),而不是 。它返回东半球的数(例如冬季的悉尼,尽管这是“提前”(UTC + 10h)。getTimezoneOffsetgetTimezoneOffset480-480-600

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!");
}

答案 2

此答案与接受的答案非常相似,但不会覆盖原型,并且仅使用一个函数调用来检查夏令时是否有效,而不是两个。Date


这个想法是,由于没有国家/地区遵守持续七个月的 DST[1],因此在遵守 DST 的地区,1 月份与 UTC 时间的偏移量将与 7 月份的偏移量不同。

虽然夏令时会向前移动时钟,但 JavaScript 在标准时间期间始终返回更大的值。因此,获取 1 月和 7 月之间的最小偏移量将获得 DST 期间的时区偏移量。

然后,我们检查日期时区是否等于该最小值。如果是这样,那么我们处于DST中;否则我们不是。

以下函数使用此算法。它采用一个 date 对象 ,如果夏令时对该日期有效,则返回,如果夏令时对该日期无效,则返回:dtruefalse

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();    
}