如何从MomentJS获得DST金额

时间:2016-03-14 02:14:50

标签: javascript momentjs

有没有办法获得DST过渡的时间。例如,有一些奇怪的时区,有30分钟的过渡。我得到这个的另一种方法是获得标准和dst时间的utc偏移量,我可以减去这两个。

如果我做moment.tz('America / Chicago')._ z.offsets我可以访问大量的所有偏移量。但是我需要知道当前年份阵列中的哪个索引。

有什么想法?

1 个答案:

答案 0 :(得分:2)

这将返回当前年份1月1日至6月1日之间UTC偏移的当前差异 - 这可能是您正在寻找的:

function getDSTBias(tz) {
    var janOffset = moment.tz({month: 0, day: 1}, tz).utcOffset();
    var junOffset = moment.tz({month: 5, day: 1}, tz).utcOffset();
    return Math.abs(junOffset - janOffset);
}

这些是相对安全的测试日期,因为它们处于冬季中期和夏季中期 - 尽管这取决于北半球或南半球。在这两个日期,anywhere in the world不会发生DST转换。

您可能会看到7月1日推荐的其他代码,但DST weirdness in Morocco可以将7月1日作为标准时间日期。

如果你不喜欢硬编码日期的想法,这里有另一种方法:

function getOffsetDelta(tz) {
    var z = moment.tz.zone(tz);
    var i = z._index(moment());
    return i < z.offsets.length-1 ? Math.abs(z.offsets[i] - z.offsets[i+1]) : 0;
}

这种方法给出了 now 与下一次计划转换之间的偏差。请注意,转换还有其他原因而不仅仅是DST - 例如标准偏移更改。

另请注意,此替代方法不会限制到当前年份的时间。因此,如果计划在未来一年取消DST,它将反映在结果中。您可以更改此选项以针对上次转换进行测试,但这也会产生奇怪的结果,例如说America/Phoenix有60分钟增量,因为Arizona experimented briefly with DST in 1967

因此,在大多数情况下,第一种方法可能是最好的。