【问题标题】:How do I get the DST amount from MomentJS如何从 MomentJS 获取 DST 金额
【发布时间】:2016-03-14 02:14:50
【问题描述】:

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

如果我这样做 moment.tz('America/Chicago')._z.offsets 我可以访问所有偏移量的大数组。但是我需要知道当前年份的数组索引。

有什么想法吗?

【问题讨论】:

  • 你能检查一下这是否有帮助吗? momentjs.com/timezone/docs/#/using-timezones/…
  • 您可以为 6 月 1 日创建一个日期,为 12 月 1 日创建另一个日期,并比较时区偏移量。有很多地方根本没有夏令时。
  • 稍后我会发布更完整的答案,但 Rob 大部分是对的。创建两个时刻并检查它们之间的utcOffset 差异。请记住,这些年的过渡可能已经发生了变化,并不是所有的过渡都是由于 DST。此外,当前为 DST 转换 30 分钟的唯一区域是 Australia/Lord_Howe。其余的都是 1 小时或根本没有。哦,还有南极洲。 ;)
  • 为什么是 6 月和 12 月 1 日?在美国,这将是 2016 年 3 月 13 日和 11 月 6 日。首先我需要弄清楚 DST 日期是什么。由于每个国家/地区每年都在变化。关于如何确定哪些日期有 DST 更改的任何想法?
  • 仅供参考——我可以通过包含额外的 timezone-utils.js 文件和 moment.tz.filterYears(moment.tz('Australia/Adelaide')._z 来缩小 _z 数组的范围,2016 年,2016 年)。这让我想到了一个由三个元素组成的数组。由于数组以 _ 开头,如果它对我来说是安全的,我会使用它,因为它可能意味着是私有的。

标签: javascript momentjs


【解决方案1】:

这将返回当前年份 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,它将反映在结果中。您可以更改它以针对 last 转换进行测试,但这也会产生奇怪的结果,例如说 America/Phoenix 有 60 分钟的增量,因为 Arizona experimented briefly with DST in 1967

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

【讨论】:

    猜你喜欢
    • 2016-12-28
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    相关资源
    最近更新 更多