打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
综合整理之后的PowerDate .方便处理常日公历日期操作
楼主zhaoxiaoyang(梅雪香@深圳)2005-10-30 22:54:15 在 Web 开发 / JavaScript 提问

综合整理之后的PowerDate   .方便处理常日公历日期操作.  
   
  <script   language="JavaScript">  
  <!--  
  function   PowerDate(){  
  /*   名称:   PowerDate    
    *   版本:   v   Beta   1.0  
    *   作者:   梅雪香(meixx)  
    *   说明:   PowerDate   基本实现了较常见的对于日期的操作,但不包括农历.  
    *   注意:   您可以随意复制此程序,请保留该说明.您可以随意更改此程序,如发现有BUG或者有改进请  
    *               mail给我一份,我的E-mail:wy_hd@163.com   或者在CSDN给我留言,我的ID是:zhaoxiaoyang  
    */    
  //日期对象  
  this.date=null;  
  //格式化时是否加零补位标志,默认为不加零false  
  this.isFmtZero=false;  
  this.weekArr=[["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],  
      ["SUN","MON","TUR","WED","THU","FRI","SAT"]];  
  this.monthArr=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"];  
  //初始化日期对象  
  switch(arguments.length){  
  case   0:  
  this.date   =   new   Date();  
  break;  
  case   1:    
  //如果为日期类型  
  if(typeof(arguments[0])   ==   "object"   &&   (/Date/.test(arguments[0].constructor))){  
  this.date   =   arguments[0];  
  }else{//字符串类型或者毫秒数  
  var   reg   =   /^(\d{2,4})\D+(\d{1,2})\D+(\d{1,2})$/;  
  var   str   =   arguments[0].replace(/\s/g,"");  
  str   =   str.replace(reg,"$1/$2/$3");  
  this.date   =   new   Date(str);  
  }  
  break;  
  case   2:   //年月----此时初始化为年月的1号  
  this.date   =   new   Date(arguments[0],arguments[1]-1,1);  
  break;  
  case   3:   //年月日  
  this.date   =   new   Date(arguments[0],arguments[1]-1,arguments[2]);  
  break;  
  case   6:   //年月日时分秒  
  this.date   =   new   Date(arguments[0],arguments[1]-1,arguments[2],arguments[3],arguments[4],arguments[5]);  
  break;  
  case   7:   //年月日时分秒毫秒  
  this.date   =   new  Date(arguments[0],arguments[1]-1,arguments[2],arguments[3],arguments[4],arguments[5],arguments[6]); 
  break;  
  default:   this.date   =   new   Date("1970/1/1");   break;  
  }  
  //初始化失败处理  
  if(typeof(this.date)   !=   "object"   ||   !(/Date/.test(this.date.constructor)))  
    throw   (new   Error(-1,   ‘构造PowerDate方法失败,检查输入参数!‘));  
   
  this.getDate   =   function   (){  
  return   this.date;  
  }  
  this.getFullYear=function(){  
  return   this.date.getFullYear();  
  };  
  this.getYear=function(){  
  return   this.date.getYear();  
  };  
  this.getMonth=function(){  
  return   this.frmWithZero(this.date.getMonth()+1);  
  };  
  this.getDay=function(){  
  return   this.frmWithZero(this.date.getDate());  
  };  
  this.getHour=function(){  
  return   this.frmWithZero(this.date.getHours());  
  };  
  this.getMinute=function(){  
  return   this.frmWithZero(this.date.getMinutes());  
  };  
  this.getSecond=function(){  
  return   this.frmWithZero(this.date.getSeconds());  
  };  
  this.getMillisecond=function(){  
  var   ss=this.date.getMilliseconds();  
  if(this.isFmtZero==true   &&   ss<10)  
  return   "00"+ss;  
  else   if(this.isFmtZero==true   &&   ss<100)  
  return   "0"+ss;  
  else   return   ss;  
  };  
  this.getWeek=function(){  
  return   this.date.getDay();  
  };  
  this.setIsFmtZero=function(val){  
  this.isFmtZero=val;  
  };  
  this.frmWithZero   =   function(num){  
  if(this.isFmtZero==true   &&   num<10)  
  return   "0"+num;  
  else   return   num;  
  }  
  /*  
    *   功能:根据输入表达式返回日期字符串  
    *   参数:dateFmt:字符串,由以下结构组成          
      *             yy:长写年,YY:短写年mm:数字月,MM:英文月,dd:日,hh:时,  
    *             mi:分,ss秒,ms:毫秒,we:汉字星期,WE:英文星期.  
  */  
  this.getString=function(dateFmt){  
  if(typeof(dateFmt)   !=   "string"   )  
  throw   (new   Error(-1,   ‘getString()方法需要字符串类型参数!‘));  
  var   str=dateFmt;  
  str=str.replace(/yy/g,this.getFullYear());  
  str=str.replace(/YY/g,this.getYear());  
  str=str.replace(/mm/g,this.getMonth());  
  str=str.replace(/MM/g,this.monthArr[this.getMonth()-1]);  
  str=str.replace(/dd/g,this.getDay());  
  str=str.replace(/hh/g,this.getHour());  
  str=str.replace(/mi/g,this.getMinute());  
  str=str.replace(/ss/g,this.getSecond());  
  str=str.replace(/ms/g,this.getMillisecond());  
  str=str.replace(/we/g,this.weekArr[0][this.getWeek()]);  
  str=str.replace(/WE/g,this.weekArr[1][this.getWeek()]);  
  return   str;  
  };  
   
  /*   功能   :   返回与某日期相距N天(N个24小时)的日期  
    *   参数   :   num   number类型   可以为正负整数或者浮点数,默认为1;  
    *                 type   0(秒)   or   1(天),默认为秒  
    *   返回   :   新的PowerDate类型  
    */  
  this.dateAfter=function(num,type){  
  num   =   (num   ==   null?1:num);  
  if(typeof(num)!="number")   throw   new   Error(-1,"dateAfterDays(num)参数为数值类型.");  
  var   iType   =   (type==null?0:type);  
  var   arr   =   [1000,86400000];  
  var   dd   =   this.date.valueOf();  
  dd   +=   num*arr[type];  
  this.date=new   Date(dd);  
  return   this;  
  };  
  //判断是否是闰年,返回true   或者   false  
  this.isLeapYear   =   function   (){  
  var   year   =   this.getFullYear();  
  return   (0==year%4   &&   ((year   %   100   !=   0)||(year   %   400   ==   0)));  
  };  
   
  //返回该月天数  
  this.getDaysOfMonth   =   function   (){  
  return   (new   Date(this.getFullYear(),this.getMonth(),0)).getDate();  
  };  
   
  //转换成大写日期(中文)  
  this.getChinaDate   =     function(){  
  var   year   =   this.getFullYear();  
  var   month=   this.getMonth();  
  var   day   =   this.getDay();  
  var   arrNum   =   ["零","一","二","三","四","五","六","七","八","九","十","十一","十二"];  
  var   strTmp="";  
  for(var   i=0,j=year.length;i<j;i++){  
  strTmp   +=   arrNum[year.charAt(i)];  
  }  
  strTmp   +=   "年";  
  strTmp   +=   arrNum[month]+"月";  
  if(day<10)  
  strTmp   +=   arrNum[day];  
  else   if   (day   <20)  
  strTmp   +=   "十"+arrNum[day-10];  
  else   if   (day   <30   )  
  strTmp   +=   "二十"+arrNum[day-20];  
  else    
  strTmp   +=   "三十"+arrNum[day-30];  
  strTmp   +=   "日";  
  return   strTmp;  
  };  
   
  //日期比较函数,参数为pd类型如this日期晚于参数:1,相等:0   早于:   -1  
  this.dateCompare   =   function(pd){  
  if(typeof(pd)   !=   "object"   ||   pd.toString()   !=   "PowerDate")  
    throw   new   Error(-1,"dateCompare(pd)的pd参数为PowerDate类型.");  
  var   d   =   this.date.getTime()   -   pd.getDate().getTime();  
  return   d>0?1:(d==0?0:-1);  
  }  
  /*功能:返回两日期之差  
    *参数:pd       PowerDate对象  
    *         type:   返回类别标识.yy:年,mm:月,ww:周,dd:日,hh:小时,mi:分,ss:秒,ms:毫秒  
    *         intOrFloat   :返回整型还是浮点型值   0:整型,不等于0:浮点型  
      *         output   :   输出提示,如:时间差为#周!  
    */  
  this.calDateDistance   =   function   (pd,type,intOrFloat,output){  
  if(typeof(pd)   !=   "object"   ||   pd.toString()   !=   "PowerDate")  
    throw   new   Error(-1,"calDateDistance(pd,type,intOrFloat)的pd参数为PowerDate类型.");  
  if(!((new   RegExp(type+",","g")).test("yy,mm,ww,dd,hh,mi,ss,ms,")))  
    throw   new   Error(-1,"calDateDistance(pd,type,intOrFloat,output)的type参数为非法.");  
  var   iof   =   (intOrFloat==null?0:intOrFloat);  
  var   miSecMain   =   this.date.valueOf();  
  var   miSecSub     =   pd.getDate().valueOf();  
  var   num=0;  
  switch(type){  
  case   "yy":   num   =   this.getFullYear()   -   pd.getFullYear();   break;  
  case   "mm":   num   =   (this.getFullYear()   -   pd.getFullYear())*12+this.getMonth()-pd.getMonth();   break;  
  case   "ww":   num   =   this.fmtRtnVal((miSecMain-miSecSub)/7/86400000,iof);   break;  
  case   "dd":   num   =   this.fmtRtnVal((miSecMain-miSecSub)/86400000,iof);   break;  
  case   "hh":   num   =   this.fmtRtnVal((miSecMain-miSecSub)/3600000,iof);   break;  
  case   "mi":   num   =   this.fmtRtnVal((miSecMain-miSecSub)/60000,iof);   break;  
  case   "ss":   num   =   this.fmtRtnVal((miSecMain-miSecSub)/1000,iof);   break;  
  case   "ms":   num   =   (miSecMain-miSecSub);break;  
  default:     break;  
  }  
  if(output)  
  return   output.replace(/#/g,num);  
  else   return   num;  
  };  
  //返回整数或者两位小数的浮点数  
  this.fmtRtnVal   =   function   (val,intOrFloat){  
  //alert(val);  
  return   (intOrFloat   ==   0   ?   Math.floor(val)   :   parseInt(val*100)/100);  
  };  
  //重载toString   方法,用来判断是否为PowerDate对象  
  this.toString=function(){   return   "PowerDate"};  
   
  }  
   
  var   d=   new   PowerDate(new   Date());//实例化一个PowerDate对象  
  d.setIsFmtZero(true);//设置为用0补位输出  
  //alert(d.getString("yy-mm-dd   hh:mi:ss.ms"));  
  //alert(d.getString("ms.ss:mi:hh   dd-mm-yy"));  
  alert(d.calDateDistance(new     PowerDate("2005/5/31"),"dd"));//输出日期字符串  
   
  //-->  
  </script>  
 问题点数:20、回复次数:17Top

1 楼zhaoxiaoyang(梅雪香@深圳)回复于 2005-10-31 10:16:27 得分 0

这年头做好人也要有实力才行啊!Top

2 楼friendlyFour(web开发四人组)回复于 2005-11-01 09:00:01 得分 0

这年头做好人也要有实力才行啊!  
  呵呵Top

3 楼windspeed(▁▂▄▅▆▇)回复于 2005-11-01 18:06:34 得分 0

收藏一下,摟主JJ幫助過偶的,一生難忘啊Top

4 楼zhaoxiaoyang(梅雪香@深圳)回复于 2005-11-01 18:55:20 得分 0

not   JJ   but   GG!Top

5 楼zhaoxiaoyang(梅雪香@深圳)回复于 2005-11-02 00:24:38 得分 0

重写了,少了不少代码  
   
  <script   language="JavaScript">  
  <!--  
  /*用相对不规则的字符串来创建日期对象,不规则的含义为:顺序包含年月日三个数值串,有间隔*/  
  String.prototype.createDate   =   function(){  
  var   reg   =   /^\D*(\d{2,4})\D+(\d{1,2})\D+(\d{1,2})\D*$/;  
  var   str   =   this.replace(/\s/g,"");  
  str   =   str.replace(reg,"$1/$2/$3");  
  var   date   =   new   Date(str);  
  if(isNaN(date)) return   new   Date();  
  else   return   date;  
  }  
   
  /*  
      *   功能:根据输入表达式返回日期字符串  
    *   参数:dateFmt:字符串,由以下结构组成          
    *             yy:长写年,YY:短写年mm:数字月,MM:英文月,dd:日,hh:时,  
    *             mi:分,ss秒,ms:毫秒,we:汉字星期,WE:英文星期.  
    *             isFmtWithZero   :   是否用0进行格式化,true   or   false  
  */  
  Date.prototype.parseString   =   function(dateFmt,isFmtWithZero){  
  dateFmt   =   (dateFmt   ==   null?"yy-mm-dd"   :   dateFmt);  
  isFmtWithZero   =   (isFmtWithZero   ==   null?true   :   isFmtWithZero);  
  if(typeof(dateFmt)   !=   "string"   )  
  throw   (new   Error(-1,   ‘parseString()方法需要字符串类型参数!‘));  
  var   weekArr=[["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],  
      ["SUN","MON","TUR","WED","THU","FRI","SAT"]];  
  var   monthArr=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"];  
  var   str=dateFmt;  
  str   =   str.replace(/yy/g,this.getFullYear());  
  str   =   str.replace(/YY/g,this.getYear());  
  str   =   str.replace(/mm/g,(this.getMonth()+1).toString().fmtWithZero(isFmtWithZero));  
  str   =   str.replace(/MM/g,monthArr[this.getMonth()]);  
  str   =   str.replace(/dd/g,this.getDate().toString().fmtWithZero(isFmtWithZero));  
  str   =   str.replace(/hh/g,this.getHours().toString().fmtWithZero(isFmtWithZero));  
  str   =   str.replace(/mi/g,this.getMinutes().toString().fmtWithZero(isFmtWithZero));  
  str   =   str.replace(/ss/g,this.getSeconds().toString().fmtWithZero(isFmtWithZero));  
  str   =   str.replace(/ms/g,this.getMilliseconds().toString().fmtWithZeroD(isFmtWithZero));  
  str   =   str.replace(/we/g,weekArr[0][this.getDay()]);  
  str   =   str.replace(/WE/g,weekArr[1][this.getDay()]);  
  return   str;  
  }  
  /*将一位数字格式化成两位,如:   9   to   09*/  
  String.prototype.fmtWithZero   =   function(isFmtWithZero){  
  if(isFmtWithZero)  
  return   (this<10?"0"+this:this);  
  else   return   this;  
  }  
  String.prototype.fmtWithZeroD   =   function(isFmtWithZero){  
  if(isFmtWithZero)  
  return   (this<10?"00"+this:(this<100?"0"+this:this));  
  else   return   this;  
  }  
   
  /*   功能   :   返回与某日期相距N天(N个24小时)的日期  
    *   参数   :   num   number类型   可以为正负整数或者浮点数,默认为1;  
    *                 type   0(秒)   or   1(天),默认为秒  
    *   返回   :   新的PowerDate类型  
    */  
  Date.prototype.dateAfter=function(num,type){  
  num   =   (num   ==   null?1:num);  
  if(typeof(num)!="number")   throw   new   Error(-1,"dateAfterDays(num,type)的num参数为数值类型.");  
  type   =   (type==null?0:type);  
  var   arr   =   [1000,86400000];  
  var   dd   =   this.valueOf();  
  dd   +=   num*arr[type];  
  return   new   Date(dd);  
  }  
   
  //判断是否是闰年,返回true   或者   false  
  Date.prototype.isLeapYear   =   function   (){  
  var   year   =   this.getFullYear();  
  return   (0==year%4   &&   ((year   %   100   !=   0)||(year   %   400   ==   0)));  
  }  
   
  //返回该月天数  
  Date.prototype.getDaysOfMonth   =   function   (){  
  return   (new   Date(this.getFullYear(),this.getMonth()+1,0)).getDate();  
  }  
   
  //转换成大写日期(中文)  
  Date.prototype.getChinaDate   =     function(){  
  var   year   =   this.getFullYear().toString();  
  var   month=   this.getMonth()+1;  
  var   day   =   this.getDate();  
  var   arrNum   =   ["零","一","二","三","四","五","六","七","八","九","十","十一","十二"];  
  var   strTmp="";  
  for(var   i=0,j=year.length;i<j;i++){  
  strTmp   +=   arrNum[year.charAt(i)];  
  }  
  strTmp   +=   "年";  
  strTmp   +=   arrNum[month]+"月";  
  if(day<10)  
  strTmp   +=   arrNum[day];  
  else   if   (day   <20)  
  strTmp   +=   "十"+arrNum[day-10];  
  else   if   (day   <30   )  
  strTmp   +=   "二十"+arrNum[day-20];  
  else    
  strTmp   +=   "三十"+arrNum[day-30];  
  strTmp   +=   "日";  
  return   strTmp;  
  }  
  //日期比较函数,参数date:为Date类型,如this日期晚于参数:1,相等:0   早于:   -1  
  Date.prototype.dateCompare   =   function(date){  
  if(typeof(date)   !=   "object"   ||   !(/Date/.test(date.constructor)))  
    throw   new   Error(-1,"dateCompare(date)的date参数为Date类型.");  
  var   d   =   this.getTime()   -   date.getTime();  
  return   d>0?1:(d==0?0:-1);  
  }  
   
  /*功能:返回两日期之差  
    *参数:pd       PowerDate对象  
    *         type:   返回类别标识.yy:年,mm:月,ww:周,dd:日,hh:小时,mi:分,ss:秒,ms:毫秒  
    *         intOrFloat   :返回整型还是浮点型值   0:整型,不等于0:浮点型  
    *         output   :   输出提示,如:时间差为#周!  
    */  
  Date.prototype.calDateDistance   =   function   (date,type,intOrFloat,output){  
  if(typeof(date)   !=   "object"   ||   !(/Date/.test(date.constructor)))  
    throw   new   Error(-1,"calDateDistance(date,type,intOrFloat)的date参数为Date类型.");  
  type   =   (type==null?‘dd‘:type);  
  if(!((new   RegExp(type+",","g")).test("yy,mm,ww,dd,hh,mi,ss,ms,")))  
    throw   new   Error(-1,"calDateDistance(pd,type,intOrFloat,output)的type参数为非法.");  
  var   iof   =   (intOrFloat==null?0:intOrFloat);  
  var   miSecMain   =   this.valueOf();  
  var   miSecSub     =   date.valueOf();  
  var   num=0;  
  switch(type){  
  case   "yy":   num   =   this.getFullYear()   -   pd.getFullYear();   break;  
  case   "mm":   num   =   (this.getFullYear()   -   pd.getFullYear())*12+this.getMonth()-pd.getMonth();   break;  
  case   "ww":   num   =   ((miSecMain-miSecSub)/7/86400000).fmtRtnVal(iof);   break;  
  case   "dd":   num   =   ((miSecMain-miSecSub)/86400000).fmtRtnVal(iof);   break;  
  case   "hh":   num   =   ((miSecMain-miSecSub)/3600000).fmtRtnVal(iof);   break;  
  case   "mi":   num   =   ((miSecMain-miSecSub)/60000).fmtRtnVal(iof);   break;  
  case   "ss":   num   =   ((miSecMain-miSecSub)/1000).fmtRtnVal(iof);   break;  
  case   "ms":   num   =   (miSecMain-miSecSub);break;  
  default:     break;  
  }  
  if(output)  
  return   output.replace(/#/g,num);  
  else   return   num;  
  }  
  //返回整数或者两位小数的浮点数  
  Number.prototype.fmtRtnVal   =   function   (intOrFloat){  
  return   (intOrFloat   ==   0   ?   Math.floor(this)   :   parseInt(this*100)/100);  
  }  
  //-->  
  </script>  
   
  <script   language="JavaScript">  
  <!--  
  var   date   =   "2004-05-25".createDate();  
  alert(date.parseString("yy-YY-mm-MM-dd   hh:mi:ss.ms     WE     we",true));  
  alert(date.calDateDistance(new   Date(),"dd",1,"相差#天!"));  
   
  //-->  
  </script>   

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
js
和我一起写lua - C和lua的参数传递与返回值
JavaScript:数据类型
JavaScript 有用的代码片段和 trick
C#实现Excel操作——添加页签Sheet
js测试方法(格式化金额,包含中文的字符串截取)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服