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