使用JavaScript在一个特定时区内抵消DST的时间

时间:2010-07-07 01:23:47

标签: javascript timezone dst

如果目前在太平洋时区的DST,我需要将时间缩短一小时。无论用户的当地时区如何,我如何确定太平洋时区的当前夏令时状态?

这是我到目前为止所拥有的。第4行中的“dst”只是一个函数的占位符,可以告诉我该区域的夏令时是否有效。

function checkTime() {  
    var d = new Date();  
    var hour = d.getUTCHours();  
    var offset = dst ? 7 : 8; // is pacific time currently in daylight savings?

    // is it currently 6 AM, 2 PM, or 10 PM?
    if (hour === ((6 + offset) % 24) || hour === ((14 + offset) % 24) || hour === ((22 + offset) % 24)) {  
      // do stuff
    }
}

checkTime();

3 个答案:

答案 0 :(得分:2)

您能够确定的唯一真实方式是您是否拥有可以询问的服务器上可用的DST信息(包括任何更新)。用户的PC甚至不需要安装时区信息。

然后你需要一个“动态”脚本来获得DST状态。

可能的方法: 引用一个PHP / ASPX / JSP / CFM / ASP页面,该页面生成一个javascript来设置一个变量,该变量指示DST是否处于活动状态,或当前的分钟数偏移量。

直接在您的(希望动态)页面中编写脚本。

使用AJAX / REST / JSON访问某个地方的日期/时间服务,该服务可以告诉您DST状态或时区/位置偏离UTC的分钟数。

分钟比小时更好,因为DST偏移实际上是几分钟,而不是几小时。

答案 1 :(得分:1)

我之前在一个基于PHP的网站上也一直在努力解决这个问题,该网站应该显示“世界时钟”。在JS中没有很好的方法来实现这一点,即便如此,你仍然严重依赖于客户端的环境。您真的需要使用您正在使用的服务器端语言来执行此任务。

如果您正在使用PHP,那么您可能会发现此代码段很有用:

function get_offset_with_DST($timezone_name) {
    $default_timezone = date_default_timezone_get();
    date_default_timezone_set($timezone_name);
    $offset_with_DST = date('Z') / 3600;
    date_default_timezone_set($default_timezone);
    return $offset_with_DST;
}

然后在JS:

<script>var offsetWithDST = <?= get_offset_with_DST('US/Pacific'); ?>;</script>

有关PHP中所有支持的时区名称的列表,请选中this page

答案 2 :(得分:0)

在美国,DST目前计算为3月的第2个星期日和11月的第1个星期日之间的时间。

要计算DST开始的日期,我们首先计算当前年份,然后计算3月1日的工作日,并根据我们计算第2个星期日。 11月也是这样,最后测试今天的日期是否在两个锚定日期之间。当真实时,dst变为“1”。

对于我的需求,日级精度是足够的,但它可以更精确地构建。

    var dst = 0
    var d = new Date();
    var myYear = parseInt(d.getFullYear())
    d.setFullYear(myYear , 2, 1);
    var what_Weekday_Mar1 = d.getDay();

    var DST_StartDay

    switch(what_Weekday_Mar1) {
        case 0:
            DST_StartDay = 14
            break;
        case 1:
            DST_StartDay = 13
            break;
        case 2:
            DST_StartDay = 12
            break;
        case 3:
            DST_StartDay = 11
            break;
        case 4:
            DST_StartDay = 10
            break;
        case 5:
            DST_StartDay = 9
            break;
        case 6:
            DST_StartDay = 8
            break;
     }

    var DST_on_Date = new Date()
    DST_on_Date = DST_on_Date.setFullYear(myYear,2,DST_StartDay)

    d.setFullYear(myYear , 10, 1);
    var what_Weekday_Nov1 = d.getDay();

    switch(what_Weekday_Nov1) {
        case 0:
            DST_EndDay = 1
            break;
        case 1:
            DST_EndDay = 7
            break;
        case 2:
            DST_EndDay = 6
            break;
        case 3:
            DST_EndDay = 5
            break;
        case 4:
            DST_EndDay = 4
            break;
        case 5:
            DST_EndDay = 3
            break;
        case 6:
            DST_EndDay = 2
            break;
     }
    var DST_off_Date = new Date()
    DST_off_Date = DST_off_Date.setFullYear(myYear,10,DST_EndDay)

    var toDay = new Date();

    /*if today is between Daylight Savings On and Off times */
    if (today>DST_on_Date && today<DST_off_Date) {
        dst = 1;    
    }

希望这有帮助!

-RL