yunye 的 JavaBlog

@see codemouse

统计

留言簿(1)

阅读排行榜

评论排行榜

[原][javascript]通过时间和时间间隔算日期----小小的原创

<html>
<head>
<script language='javascript'>

///////////////////////////////基础小处理函数

function cekleap(input)//判断闰年
{
if(typeof(input)=="string")
{var y=input.substring(0,4);}
else
{var y=input}
if(y%4!=0)
{return false;}
else
{
    if((y%100!=0)||(y%400==0)){return true;}
    else{return false;}
}
}

function calMMDD(indays,leap)//知道天数算日期且indays<=(365or366);leap为真为闰年,为假为平年
{
var a1=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var a2=new Array(31,29,31,30,31,30,31,31,30,31,30,31);

var inN=indays;
var inL=leap;

switch(inL)
{
case true:{var aa=a2;break;}
case false:{var aa=a1;break;}
default:{break;}
}

var outO=new Object();

for(var i=0;i<12;i++)
{
    if(inN<=aa[i])
    {
    outO.mm=i+1;
    outO.dd=inN;
    break;
    }
    else
    {inN-=aa[i];}
}
return(outO);
}

function convertion(yy,mm,dd)//整理输出
{
switch(mm<10)
{
case true:{mm="0"+mm;break;}
default:{break;}
}
switch(dd<10)
{
    case true:{dd="0"+dd;break;}
    default:{break;}
}
var outS=yy+"-"+mm+"-"+dd;//格式可更改
return(outS);
}

///////////////////////////////算以后的日期

function addday(inputS,inputN)     //inputS 的格式 yyyy-mm-dd  
{
// alert("l12");
var outS="";

var dis=inputN-0;//先处理下 转成数字
var yy=inputS.substring(0,4)-0;
var mm=inputS.substring(5,7)-0;
var dd=inputS.substring(8,10)-0;
//alert(yy);
//alert(mm);
//alert(dd);

var a1=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var a2=new Array(31,29,31,30,31,30,31,31,30,31,30,31);

if(!cekleap(yy))
{
    var aa=a1;
}
else
{
    var aa=a2;
}

var tt=aa[mm-1]-dd; //本月剩下的天数
//alert(aa[mm-1]);  

if(dis<=tt)     //先处理本月
     {
      dd+=dis;
      outS=convertion(yy,mm,dd);
      return(outS);
     }
else
     {
      mm+=1;     
      dis-=tt;
     }

if(mm==13)//是否跨年
{
yy+=1;
mm=1;
if(!cekleap(yy))
{
    aa=a1;
}
else
{
    aa=a2;
}
}

for(var i=(mm-1);i<=11;i++)     //接着后面处理
{
    switch (i)
     {
      case 11:        //判断是否为12月
       {
//      alert("laa");
        if(dis<=aa[i])
         {
outS=convertion(yy,(i+1),dis);
return(outS);
         }
        else
         {
          dis-=aa[i];
yy+=1;
if(!cekleap(yy))
    {
     aa=a1;
    }
    else
    {
     aa=a2;
    }
i=-1; //跨年
         }
break;
       }
      default:
       {
//       alert("l7");
        if(dis<=aa[i])
        {
outS=outS=convertion(yy,(i+1),dis);
// alert(outS);
return(outS);
        }
        else
        {
         dis-=aa[i];       
        }
break;
       }
     }
}
//alert("l10");
}


///////////////////////////////算以前的日期

function subtractday(inputS,inputN)     //inputS 的格式 yyyy-mm-dd  
{
var outS="";

var dis=inputN-0;
var yy=inputS.substring(0,4)-0;
var mm=inputS.substring(5,7)-0;
var dd=inputS.substring(8,10)-0;

var a1=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var a2=new Array(31,29,31,30,31,30,31,31,30,31,30,31);

if(!cekleap(yy))
{
    var aa=a1;
}
else
{
    var aa=a2;
}

if(dis<dd)     //先处理本月
     {    
      outS=convertion(yy,mm,(dd-dis));
      return(outS);
     }
else
     {mm-=1;     
      dis-=dd;}


if(mm==0)//看是否跨年
{
yy-=1;
mm=12;
if(!cekleap(yy))
{
    aa=a1;
}
else
{
    aa=a2;
}
}

for(var i=(mm-1);i>=0;i--)     //接着后面处理
{
    switch (i)
     {
      case 0:        //判断是否为1月
       {
        if(dis<aa[i])
         {
outS=convertion(yy,(i+1),(aa[i]-dis));
return(outS);
         }
        else
         {
          dis-=aa[i];
yy-=1;
if(!cekleap(yy))
    {
     aa=a1;
    }
    else
    {
     aa=a2;
    }
i=12; //跨年
         }
break;
       }
      default:
       {
        if(dis<aa[i])
        {
outS=convertion(yy,(i+1),(aa[i]-dis));
return(outS);
        }
        else
        {
         dis-=aa[i];       
        }
break;
       }
     }
}
}

////////////////////////////////////间隔输入可正可负

function multiuseday(inputS,inputN) //inputS的格式 yyyy-mm-dd    inputN为天数(可正可负) 估算结果时间不能早于1970.01.01或者超过2100年
{
var outS;
var indate=new Date(inputS.substring(0,4),(inputS.substring(5,7)-1),inputS.substring(8,10)); //起点时间
var Stime=new Date(1970,00,01);//标准时间    //注意:用 new Date 月份是从0开始的
var Tdis=indate-Stime+24*60*60*1000;//因为从1号开始 所以要加一天
var oneday=24*60*60*1000;

//alert("x1");
//alert(Tdis/oneday);

//alert("xX1");
//alert(indate/oneday);

var dis=(inputN-0)*24*60*60*1000;//换成毫秒

//alert("x11");
//alert(dis/oneday);

if(dis==0){return(inputS);}

dis=(Tdis+dis)/oneday;

//alert("x111");
//alert(dis);

var normalyear=365;
var leapyear=366;

var Ydis=0;//年间隔
var Ddis=0;//天间隔
var mmdd=new Object();//月份日号对象


if(dis<=normalyear)//1970年
{
    Ddis+=dis;
    mmdd=calMMDD(Ddis,false);
    outS=convertion((1970+Ydis),mmdd.mm,mmdd.dd);////
    return(outS);
}

if(dis<=(normalyear*2))//1971年
{
    Ydis=1;
    Ddis+=(dis-365);
    mmdd=calMMDD(Ddis,false);
    outS=convertion((1970+Ydis),mmdd.mm,mmdd.dd);////
    return(outS);
}

//alert("x1111");
//alert(Ddis);

dis-=(normalyear*2);

//alert("bbb1");
//alert(dis);

//4年周期处理 从1972闰年开始

Ydis=Math.floor(dis/(leapyear+normalyear*3));//注意处理小数部分

Ydis=2+Ydis*4;//年的间隔

Ddis=Ddis+dis%(leapyear+normalyear*3); //落在一个周期内的天数

//alert("x11111");
//alert(Ddis);
if(Ddis==0)//正好落在周期的最后1天 特殊处理
{Ydis-=4;Ddis=1461;}


if(Ddis<=731)    //做周期内判断 1闰3平
{
    if(Ddis<=366)
    {
     mmdd=calMMDD(Ddis,true);
    }
    else
    {
     Ydis+=1;
     Ddis-=366;
     mmdd=calMMDD(Ddis,false);
    }
}
else
{
    if(Ddis<=1096)
     {
      Ydis+=2;
      Ddis-=731;
      mmdd=calMMDD(Ddis,false);
     }
    else
     {
      Ydis+=3;
      Ddis-=1096;
      mmdd=calMMDD(Ddis,false);
     }
}
outS=convertion((1970+Ydis),mmdd.mm,mmdd.dd);////
return(outS);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


function clka()
{
var mes=cekleap("2008");
alert(mes);
}

function add()
{
var obj01=document.getElementById("txt01");
var obj02=document.getElementById("txt02");
var obj03=document.getElementById("txt03");
obj03.value=addday(obj01.value,obj02.value);
}

function subtract()
{
var obj04=document.getElementById("txt04");
var obj05=document.getElementById("txt05");
var obj06=document.getElementById("txt06");
obj06.value=subtractday(obj04.value,obj05.value);
}

function multiuse()
{
var obj07=document.getElementById("txt07");
var obj08=document.getElementById("txt08");
var obj09=document.getElementById("txt09");
obj09.value=multiuseday(obj07.value,obj08.value);
}
</script>

</head>
<body>
<input type='text' id='txt01' name='txt01' size='20'>&nbsp;+
<input type='text' id='txt02' name='txt02' size='20'>&nbsp;=
<input type='text' id='txt03' name='txt03' size='20'>&nbsp;ADD控制
<br><br>
<input type='text' id='txt04' name='txt01' size='20'>&nbsp;-
<input type='text' id='txt05' name='txt02' size='20'>&nbsp;=
<input type='text' id='txt06' name='txt02' size='20'>&nbsp;SUB控制
<br><br>
<input type='text' id='txt07' name='txt07' size='20'>&nbsp;
<input type='text' id='txt08' name='txt08' size='20'>&nbsp;
<input type='text' id='txt09' name='txt09' size='20'>&nbsp;MULUSE控制
<br><br>
&nbsp;&nbsp;&nbsp;
<input type='button' id='btn01' name='btn01' value='检    测' >
<input type='button' id='btn02' name='btn02' value='L E A P' onClick='clka();'>
<input type='button' id='btn03' name='btn03' value='A D D' onClick='add();'>
<input type='button' id='btn04' name='btn04' value='S U B' onClick='subtract();'>
<input type='button' id='btn05' name='btn05' value='M U L' onClick='multiuse();'>
</body>
</html>

上面的代码经过本人的基本功能测试 还勉强可以对付下 呵呵

posted on 2008-08-30 03:23 yunye 阅读(517) 评论(0)  编辑  收藏 所属分类: javascript


只有注册用户登录后才能发表评论。


网站导航: