使用JavaScript获取一个特定时区的夏令时偏移时间

8

如果目前太平洋时区正在实行夏令时,我需要将时间提前一小时。无论用户的本地时区是什么,我该如何确定太平洋时区的当前夏令时状态?

以下是我目前的代码。第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();

欢迎来到SO,请不要忘记访问http://stackoverflow.com/faq。 - Reigel Gallarde
我曾提出一个相关问题,在那里我列举了几种实现这个目标的方法,但我并没有发现最佳方法。然而,它们仍然可能是相关的。https://dev59.com/sG445IYBdhLWcg3wWZAU - Tauren
3个回答

2
唯一能够确定的方法是,如果您在可以询问的服务器上有DST信息(包括任何更新)。用户的个人电脑甚至不需要安装时区信息。然后您需要一个“动态”脚本来获取DST状态。可能的方法有:引用生成指示DST是否激活或当前偏移分钟数的JavaScript的PHP / ASPX / JSP / CFM / ASP页面;直接在您的(希望是动态的)页面中编写脚本;使用AJAX / REST / JSON访问某个日期/时间服务,该服务可以告诉您特定时区/位置的DST状态或UTC偏移分钟数。分钟比小时更好,因为世界各地的DST偏移实际上是以分钟为单位。

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 中所有支持的时区名称列表,请查看此页面


0

在美国,夏令时(DST)目前被计算为从三月的第二个星期日到十一月的第一个星期日之间的时间。

要计算夏令时开始的日期,我们首先计算当前年份,然后确定三月一日是星期几,基于此可以计算出第二个星期日。同样的方法也适用于十一月,最后我们测试今天的日期是否在这两个锚定日期之间。如果是,则将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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接