2010-07-07 87 views
7

如果当前的DST位于太平洋时区,我需要将时间偏移一小时。无论用户当地的时区如何确定太平洋时区的当前夏令时状态?使用JavaScript在一个特定时区的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(); 
+0

欢迎的话,请不要忘了参观http://stackoverflow.com/faq – Reigel 2010-07-07 01:29:48

+0

我问一个相关的问题,我找出几种方法可以做到做到这一点,没有一个我觉得最佳。但是,它们仍然可能是相关的。http://stackoverflow.com/questions/4903722/working-with-timezones-and-daylight-savings-time-in-javascript – Tauren 2011-02-04 23:25:56

回答

2

唯一真正可以确定的方法是如果您有服务器上可用的DST信息(包括任何更新),您可以询问。用户的PC甚至不需要安装时区信息。

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

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

将脚本直接写入(希望是动态的)页面中。

使用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中的名称,请检查this page

0

在美国,DST目前计算为三月第二个星期日和十一月第一个星期日之间的时间。

为了计算DST开始的日期,我们首先计算当前年份,然后在3月份的第一个工作日进行计算,并基于此计算第二个星期日。 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