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 閱讀(581) 評論(0)  編輯  收藏 所屬分類: javascript

          主站蜘蛛池模板: 大名县| 府谷县| 宁武县| 九寨沟县| 乌审旗| 习水县| 徐汇区| 攀枝花市| 黔西| 北安市| 黔江区| 涿州市| 民县| 绥宁县| 华容县| 郧西县| 五莲县| 和平县| 肇东市| 宿松县| 台北县| 青龙| 自贡市| 蒙城县| 贵州省| 德化县| 延安市| 峡江县| 三穗县| 开原市| 宜章县| 牙克石市| 焉耆| 鹿泉市| 扶沟县| 石门县| 南江县| 新闻| 定兴县| 中超| 富宁县|