Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从日期对象计算BST时间?_Javascript_Date_Dst_Timezone Offset - Fatal编程技术网

Javascript 从日期对象计算BST时间?

Javascript 从日期对象计算BST时间?,javascript,date,dst,timezone-offset,Javascript,Date,Dst,Timezone Offset,我已经回顾了一些关于类似主题的问题,但没有一个涉及到计算目的时区,并将其DST(夏令时)考虑在内。我正在尝试编写一个简单的小部件,向访问页面的任何人显示特定时区的实时本地时间。感兴趣的时区是BST(),但如果可能的话,我希望看到适用于任何语言环境的通用实现。以下是我的尝试,使用香草JavaScript: 函数getBST(){ 变量日期=新日期(), utc=date.getTime()+date.getTimezoneOffset()*60000, 本地=新日期(utc),//这是GMT,不

我已经回顾了一些关于类似主题的问题,但没有一个涉及到计算目的时区,并将其DST(夏令时)考虑在内。我正在尝试编写一个简单的小部件,向访问页面的任何人显示特定时区的实时本地时间。感兴趣的时区是BST(),但如果可能的话,我希望看到适用于任何语言环境的通用实现。以下是我的尝试,使用香草JavaScript:

函数getBST(){ 变量日期=新日期(), utc=date.getTime()+date.getTimezoneOffset()*60000, 本地=新日期(utc),//这是GMT,不是BST day=local.getDate(), mon=local.getMonth()+1, year=local.getFullYear(), hour=local.getHours(), 分钟=('0'+local.getMinutes()).slice(-2), 秒=('0'+local.getSeconds()).slice(-2), 后缀=小时<12?'AM':'PM'; 小时=(小时-24)%12+12; 返回mon+'/'+day+'/'+year+','+hour+':'+minute+':'+second+'+后缀; } setInterval(函数(){ document.body.textContent=getBST();
}, 1000);在纯JS中不可能只使用
Date
方法,但是(当然)有一个库:

例如:

moment.tz("Europe/London").format(); // 2016-01-15T09:21:08-07:00

支持一个时区并不困难,只要您知道它何时转换为夏令时和何时转换为夏令时

javascript日期由UTC时间值和基于主机系统设置的时区偏移组成。所以你所需要做的就是把你想要的时区偏移量应用到UTC时间上,然后在任何时区中都有你的时间

虽然有一些实际标准(如和),但没有标准化的时区缩写系统。我猜英国夏令时是指英国夏令时,也称为英国夏令时(BDT)和英国夏令时(BDST)。也可能是孟加拉国标准时间或布干维尔标准时间,也称为“BST”

有各种库(如)使用IANA代码,可以为任何时间(或多或少)提供任何支持时区的时间

BST从每年3月最后一个星期日的01:00 UTC开始,到每年10月最后一个星期日的01:00 UTC结束,因此算法为:

  • 根据系统的本地设置创建新日期(例如
    newdate()
  • 根据UTC值创建BST的开始和结束日期(本年度,2016-03-27T01:00:00Z和2016-03-30T02:00:00Z)
  • 查看当前UTC时间是否在该范围内
  • 如果是,则在#1中创建的日期的UTC时间加上1小时
  • 根据日期的UTC值输出格式化字符串
  • 就这样,唯一困难的是找到合适的周日日期。你根本不需要考虑本地时区偏移,因为所有的东西都是基于UTC和日期对象的。 现在我没有时间提供代码,所以试一试,我可以在大约10小时后给你回复

    编辑 这是代码。前两个函数是helpers,一个函数获取一个月的最后一个星期日,另一个函数使用偏移量格式化ISO 8601字符串。大部分工作都是在这两个功能中完成的。希望这些评论是足够的,如果需要更多的解释,请询问

    我没有在字符串中包含毫秒,如果需要,可以随意添加毫秒,在格式化字符串的偏移部分之前添加
    +'.+('00'+d.getutcmillesons()).slice(-3)

    请注意,如果开始或停止夏令时的日期发生更改,则需要修改该功能,但这种情况很少发生。当然,历史日期需要一个小型数据库,记录特定年份和时期夏令时的开始和停止时间

    /*返回一个月内最后一个星期日的日期
    **@param{number}年-全年数(如2015年)
    **@param{number}月-日历月数(一月=1)
    **@returns{Date}指定月份最后一个星期日的日期
    */
    函数getLastSunday(年、月){
    //创建月份最后一天的日期
    var d=新日期(年、月、0);
    //调整到上周日
    d、 setDate(d.getDate()-d.getDay());
    返回d;
    }
    /*使用提供的偏移量将日期字符串格式化为ISO 8601
    **@param{Date}Date-要格式化的日期
    **@param{number}offset-分钟内的偏移量(+东,-西),将为
    **转换为+/-00:00
    **@返回{string}格式的日期和时间
    **
    **请注意,javascript日期偏移是相反的:-east、+west,但是
    **此函数不使用日期的偏移量。
    */
    函数格式日期(d,偏移量){
    函数z(n){return('0'+n).slice(-2)}
    //默认偏移量为0
    偏移量=偏移量| | 0;
    //生成偏移量字符串
    var offSign=偏移量<0?'-':'+';
    偏移量=数学绝对值(偏移量);
    var offString=offSign+('0'+(offset/60 | 0)).slice(-2)+':'+('0'+(offset%60)).slice(-2);
    //生成日期字符串
    返回d.getUTCFullYear()+'-'+z(d.getUTCMonth()+1)+'-'+z(d.getUTCDate())+
    “T'+z(d.getUTCHours())+”:“+z(d.getUTCMinutes())+”:“+z(d.getUTCSeconds())+
    外串;
    }
    /*伦敦当前时间的返回日期对象。假设
    **夏时制将于3月最后一个星期日UTC 01:00开始
    **并于10月最后一个星期日UTC 01:00结束。
    **@param{Date}d-要测试的日期。默认为当前值
    **系统日期和时间
    **@param{boolean,可选}obj-如果为true,则返回一个日期对象。否则,请返回
    **ISO 8601格式的字符串
    */
    函数getLondonTime(d,obj){
    //使用提供的日期或默认值为当前日期和时间
    d=d | |新日期();
    //获取所提供日期年份的夏令时开始和结束日期
    //将UTC日期值和时间设置为01:00
    var dstS=getLastSunday(d.getFullYear(),3);
    var dstE=getLastSunday(d.getFullYear(),10);
    dstS=新日期(Date.UTC(dstS.getFullYear(),dstS.getMonth(),dstS.getDate(),1));
    dstE=新Da