【问题标题】:Offset time for DST in one specific timezone using JavaScript使用 JavaScript 在一个特定时区的 DST 偏移时间
【发布时间】:2011-03-12 14:26:17
【问题描述】:

如果太平洋时区当前是 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();

【问题讨论】:

标签: javascript timezone dst


【解决方案1】:

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

那么你需要一个“动态”脚本来获取 DST 状态。

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

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

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

分钟比小时更可取,因为 DST 偏移实际上以分钟为单位,而不是小时。

【讨论】:

    【解决方案2】:

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

    如果碰巧你也在使用 PHP,那么你可能会发现这个 sn-p 很有用:

    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

    【讨论】:

      【解决方案3】:

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

      要计算 DST 开始的日期,我们首先计算当前年份,然后计算 3 月 1 日的星期几,并据此计算第二个星期日。 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

      【讨论】:

        猜你喜欢
        • 2011-08-04
        • 2020-08-05
        • 2019-07-17
        • 1970-01-01
        • 1970-01-01
        • 2015-02-14
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        相关资源
        最近更新 更多