【问题标题】:Determining when DST is in effect [duplicate]确定 DST 何时生效 [重复]
【发布时间】:2013-03-29 15:57:19
【问题描述】:

我最近遇到了一个问题...

假设我有一些这样的 Javascript,例如:

var timezone = -(new Date()).getTimezoneOffset() / 60; // Get the TZ offset

var local = [];
var gmt   = [];

for(var i = 0; i <= 23; i++) // Loop through each hour
{
    local.push(i);

    var time = (i + timezone);

    if(time == 24)
        time = 0;

    gmt.push(time);
}

这在不在 DST 时完美运行,但是当 DST 到来时,我有意想不到的结果,例如:(本地用户在 GMT/DST)

> console.log(local);
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]

> console.log(gmt);
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0]

两个数组应该相同的地方。

我如何检测夏令时生效的时间?

【问题讨论】:

  • 鉴于您使用的算法,结果似乎完全正确。它应该适用于每一天,除非跨越白天时间边界。也许你可以解释你遇到的问题。
  • 您的意思是当地时区是 GMT/BST(与 WET/WEST 相同),不是吗?
  • 问题是应用程序应该检测 BST 何时生效并基本上将 GMT 更改为 BST @TomBlodget
  • @JordanDoyle - 这似乎正是它正在做的事情。它通过从返回当前日期/时间的new Date() 获取偏移量来检测 BST 是否有效。你为什么希望它保持不变?您是否只是在寻找不考虑 DST 的“标准”偏移量?
  • 我不希望两者相同,因为用户处于(当前)BST 时区,这意味着两个数组应该相同 - 就 DST 而言。在 DST 发生之前,这两个阵列是相同的。 @MattJohnson

标签: javascript time timezone dst


【解决方案1】:

此功能将帮助您使用 DST 进行计算。

function dstOffset() {
    var dailyOffsets = [];
    for (var i = 0; i <= 366; i++) { // sample timezone offset over at least a year since daylight saving changes are repeated each year.
        var sampleDay = new Date(); // today at whatever time
        sampleDay.setDate(i); // i days from the begining of this month (at the same time)
        dailyOffsets.push(sampleDay.getTimezoneOffset());
    }
    return Math.min.apply(null, dailyOffsets);
}
alert(dstOffset() + " minutes");

【讨论】:

  • 这会起作用,但它肯定是一种蛮力方法。而且它没有考虑到许多时区在过去改变了它们的偏移量。到目前为止,您最好的建议是使用时区数据库。最好在服务器上执行此操作,但如果需要,也有一些可用于 javascript。
【解决方案2】:

这就是我最终得到的结果,它检测到 3 月的最后一个星期日和 10 月的最后一个星期日,并检查我们目前是否在这些日子之内。谢谢大家的cmets和回答。

请随意编辑并向我提供建议/改进。我觉得这不是最好的方法。

function is_bst()
{
    var date    = new Date();
    var march   = null;
    var october = null;

    for(var i = 7; i != 0; i--)
    {
        var day = new Date(date.getFullYear(), 2, i);

        if(day.getDay() == 0)
        {
            march = day;
            break;
        }
    }

    for(var i = 7; i != 0; i--)
    {
        var day = new Date(date.getFullYear(), 9, i);

        if(day.getDay() == 0)
        {
            october = day;
            break;
        }
    }

    return !(date < march || date > october);
}

【讨论】:

  • 您的代码过于本地化。在某些时候,此代码将由不在英国的人运行。在某个时候,英国将更改其 DST 法律,稍后将更新 JavaScript 库以反映这一点。
  • 是否有办法检测一个定义的国家何时进入 DST? @TomBlodget
  • 查看我之前的答案以获得解决方法。我认为 JavaScript 中没有时区数据库。
  • @TomBlodget - 有几个。我知道的四个我列出了here
  • @JordanDoyle - 如果您想具体确定 BST 或 GMT 是否有效,那么您确实需要一个时区数据库,并且您将指定 Europe\London 时区。如果您只是想确定用户是否处于某种形式的夏令时,则必须从他们的时钟中采样几个日期并尝试做出一些猜测。 “可能重复”链接中的一个答案显示一月份的支票和七月份的另一张支票。这仍然是相当假设性的,但在正确的轨道上。
猜你喜欢
  • 2012-05-09
  • 2016-08-11
  • 2013-09-25
  • 1970-01-01
  • 2019-08-13
  • 2011-11-27
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多