写了一个求时间差的Javascript函数,可是老是出错(与SQLServer中的datediff相比,有偏差)
Date.prototype.diff=function(part,redate){
var enddate,msspan,diff;
var re=new RegExp(/^(\d{4})-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2]\d|3[0-1])( (0?\d|1\d|2[0-3]):(0?\d|[1-5]\d):(0?\d|[1-5]\d)([.](\d{1,3}))?)?$/);
var reprefix0=new RegExp(/^0(\d)/);
if(re.test(redate))
{
re.exec(redate);
var yyyy=RegExp.$1;
var mm=RegExp.$2;
var dd=RegExp.$3;
var hh=RegExp.$5;
var mi=RegExp.$6;
var ss=RegExp.$7;
var ms=RegExp.$9;
var yyyy=parseInt(yyyy);
var mm=parseInt(delPrefixZero(mm))-1;
dd=parseInt(delPrefixZero(dd));
hh=parseInt(delPrefixZero(hh));
mi=parseInt(delPrefixZero(mi));
ss=parseInt(delPrefixZero(ss));
ms=parseInt(delPrefixZero(ms));
enddate=new Date(yyyy,mm,dd,hh,mi,ss);
}
else
{
try
{
enddate=new Date(Date.parse(redate));
}
catch(e)
{
alert(e);
return;
}
}
if(enddate=="Invalid Date"){
alert("非法日期!");
return;
}else{
msspan=enddate.getTime()-this.getTime();
switch(part){
case "ss":
diff=msspan/1000;
break;
case "mi":
diff=msspan/1000/60;
break;
case "hh":
diff=msspan/1000/60/60;
break;
case "dd":
diff=msspan/1000/60/60/24;
break;
case "wk":
diff=msspan/1000/60/60/24/7;
break;
case "mm":
diff=(enddate.getFullYear()-this.getFullYear())*12+enddate.getMonth()-this.getMonth();
break;
case "qq":
diff=((enddate.getFullYear()-this.getFullYear())*12+enddate.getMonth()-this.getMonth())/3;
break;
case "yy":
diff=enddate.getFullYear()-this.getFullYear();
break;
default:
diff=msspan;
}
diff=parseInt(diff);
return diff;
}
function delPrefixZero(str)
{
var re=new RegExp(/^0*/);
str=str.replace(re,"");
if(str=="")str="0";
return str;
}
}现在的问题是,在SqlServer中,datediff(mi,'2009-10-10 09:21:59','2009-10-10 09:22:00')得到的相差分数为1分钟,实际上差的是1秒钟,用js得到的则为0分钟,该如何校正呢?
Date.prototype.diff=function(part,redate){
var enddate,msspan,diff;
var re=new RegExp(/^(\d{4})-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2]\d|3[0-1])( (0?\d|1\d|2[0-3]):(0?\d|[1-5]\d):(0?\d|[1-5]\d)([.](\d{1,3}))?)?$/);
var reprefix0=new RegExp(/^0(\d)/);
if(re.test(redate))
{
re.exec(redate);
var yyyy=RegExp.$1;
var mm=RegExp.$2;
var dd=RegExp.$3;
var hh=RegExp.$5;
var mi=RegExp.$6;
var ss=RegExp.$7;
var ms=RegExp.$9;
var yyyy=parseInt(yyyy);
var mm=parseInt(delPrefixZero(mm))-1;
dd=parseInt(delPrefixZero(dd));
hh=parseInt(delPrefixZero(hh));
mi=parseInt(delPrefixZero(mi));
ss=parseInt(delPrefixZero(ss));
ms=parseInt(delPrefixZero(ms));
enddate=new Date(yyyy,mm,dd,hh,mi,ss);
}
else
{
try
{
enddate=new Date(Date.parse(redate));
}
catch(e)
{
alert(e);
return;
}
}
if(enddate=="Invalid Date"){
alert("非法日期!");
return;
}else{
msspan=enddate.getTime()-this.getTime();
switch(part){
case "ss":
diff=msspan/1000;
break;
case "mi":
diff=msspan/1000/60;
break;
case "hh":
diff=msspan/1000/60/60;
break;
case "dd":
diff=msspan/1000/60/60/24;
break;
case "wk":
diff=msspan/1000/60/60/24/7;
break;
case "mm":
diff=(enddate.getFullYear()-this.getFullYear())*12+enddate.getMonth()-this.getMonth();
break;
case "qq":
diff=((enddate.getFullYear()-this.getFullYear())*12+enddate.getMonth()-this.getMonth())/3;
break;
case "yy":
diff=enddate.getFullYear()-this.getFullYear();
break;
default:
diff=msspan;
}
diff=parseInt(diff);
return diff;
}
function delPrefixZero(str)
{
var re=new RegExp(/^0*/);
str=str.replace(re,"");
if(str=="")str="0";
return str;
}
}现在的问题是,在SqlServer中,datediff(mi,'2009-10-10 09:21:59','2009-10-10 09:22:00')得到的相差分数为1分钟,实际上差的是1秒钟,用js得到的则为0分钟,该如何校正呢?
解决方案 »
- zTree树形菜单问题
- 全国省市县三级联动 选到县后显示邮编 不想用数据库
- 高手帮帮忙,为什么javascript响应不了submit事件
- var tj={"01":["1","2","3"], "02":["4","5","6"]}
- 在dreamweaver2004中怎样达到这种效果!
- 如何先history.go(-2) 然后刷新该窗口呢? ----挑战性问题 *^_^*
- 在文本框里怎样能屏蔽掉键盘的delete和删除键,防止删除操作?
- 如何实现像windows开始那种菜单,而且是跨帧的,请高手指点。
- 请帮我看看以下代码错在哪里?错误提示是:缺少对象!谢谢
- 能进来看的就都来看看!一个始终没能解决的问题,曾经提过,各位大虾帮忙献技!!!!
- 这为什么会弹出4??????
- 帮忙解决一下面试题
var end = new Date('2009/9/11');
alert((end-begin)/1000+"秒");
你想要那样的话就不要直接
diff=parseInt(diff);
return diff;
先Math.ceil(diff)一下.
var def = Date.parse(date1) - Date.parse(date2);
alert("时间间隔为 " + def + "毫秒");-----------------------------------------------------------
www.bleehome.cn
这种方法在diff为负值时会出错,总是已经解决了,谢谢各位