js中Date对象的format操作类,名为DateFormat,很好用

本文详细介绍了日期时间格式化工具类的功能,包括格式化当前日期、格式化给定日期、解析字符串日期时间、计算日期差值以及格式化日期等。通过实例展示了如何灵活运用该工具类进行日期时间的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. <pre class="javascript" name="code">/**  
  2.  * 此JS文件是格式化JS中日期时间的工具类,其中包含了传入日期对象Date,格式化成想要的格式,<br>  
  3.  * 或者传入字符串格式的时间个,次字符串日期对应的格式可以转换为相应的日期对象,<br>  
  4.  * 可以计算两个日期之间的差值  
  5.  *   
  6.  * y: 表示年  
  7.  * M:表示一年中的月份 1~12  
  8.  * d: 表示月份中的天数 1~31  
  9.  * H:表示一天中的小时数 00~23  
  10.  * m: 表示小时中的分钟数 00~59  
  11.  * s: 表示分钟中的秒数   00~59  
  12.  */    
  13.       
  14.   var DateFormat = function(bDebug){    
  15.       this.isDebug = bDebug || false;    
  16.       this.curDate = new Date();    
  17.   }    
  18.      
  19.  DateFormat.prototype = {    
  20.     //定义一些常用的日期格式的常量     
  21.     DEFAULT_DATE_FORMAT: 'yyyy-MM-dd',    
  22.     DEFAULT_MONTH_FORMAT: 'yyyy-MM',    
  23.     DEFAULT_YEAR_FORMAT: 'yyyy',    
  24.     DEFAULT_TIME_FORMAT: 'HH:mm:ss',    
  25.     DEFAULT_DATETIME_FORMAT: 'yyyy-MM-dd HH:mm:ss',    
  26.     DEFAULT_YEAR: 'YEAR',    
  27.     DEFAULT_MONTH: 'MONTH',    
  28.     DEFAULT_DATE: 'DATE',    
  29.     DEFAULT_HOUR: 'HOUR',    
  30.     DEFAULT_MINUTE: 'MINUTE',    
  31.     DEFAULT_SECOND: 'SECOND',    
  32.         
  33.     /**  
  34.      * 根据给定的日期时间格式,格式化当前日期  
  35.      * @params strFormat 格式化字符串, 如:"yyyy-MM-dd" 默认格式为:“yyyy-MM-dd HH:mm:ss”  
  36.      * @return 返回根据给定格式的字符串表示的时间日期格式<br>  
  37.      *         如果传入不合法的格式,则返回日期的字符串格式{@see Date#toLocaleString()}  
  38.      */    
  39.      formatCurrentDate: function(strFormat){    
  40.        try{    
  41.           var tempFormat = strFormat == undefined? this.DEFAULT_DATETIME_FORMAT: strFormat;    
  42.           var dates = this.getDateObject(this.curDate);    
  43.           if(/(y+)/.test(tempFormat)){    
  44.              var fullYear = this.curDate.getFullYear() + '';    
  45.              var year = RegExp.$1.length == 4? fullYear: fullYear.substr(4 - RegExp.$1.length);    
  46.              tempFormat = tempFormat.replace(RegExp.$1, year);    
  47.           }    
  48.           for(var i in dates){    
  49.              if(new RegExp('(' + i + ')').test(tempFormat)){    
  50.                 var target = RegExp.$1.length == 1? dates[i]: ('0' + dates[i]).substr(('' + dates[i]).length - 1);    
  51.                 tempFormat = tempFormat.replace(RegExp.$1, target);    
  52.              }    
  53.           }    
  54.           return tempFormat === strFormat? this.curDate.toLocaleString(): tempFormat;    
  55.        }catch(e){    
  56.           this.debug('格式化日期出现异常:' + e.message);    
  57.        }    
  58.     },    
  59.         
  60.         
  61.     /**  
  62.      * 根据给定的格式,把给定的时间进行格式化  
  63.      * @params date 要格式化的日期  
  64.      * @params strFormat 要得到的日期的格式的格式化字符串,如:'yyyy-MM-dd',默认:yyyy-MM-dd HH:mm:ss  
  65.      * @return 根据规定格式的时间格式  
  66.      *    
  67.      * @updateDate 2011-09-15  
  68.      */    
  69.     format: function(date, strFormat){    
  70.      try{    
  71.         if(date == undefined){    
  72.            this.curDate = new Date();    
  73.         }else if(!(date instanceof Date)){    
  74.            this.debug('你输入的date:' + date + '不是日期类型');    
  75.            return date;    
  76.         }else{    
  77.            this.curDate = date;    
  78.         }    
  79.         return this.formatCurrentDate(strFormat);    
  80.      }catch(e){    
  81.         this.debug('格式化日期出现异常:' + e.message);    
  82.      }    
  83.     },    
  84.         
  85.     /**  
  86.      * 根据给定的格式对给定的字符串日期时间进行解析,  
  87.      * @params strDate 要解析的日期的字符串表示,此参数只能是字符串形式的日期,否则返回当期系统日期  
  88.      * @params strFormat 解析给定日期的顺序, 如果输入的strDate的格式为{Date.parse()}方法支持的格式,<br>  
  89.      *         则可以不传入,否则一定要传入与strDate对应的格式, 若不传入格式则返回当期系统日期。  
  90.      * @return 返回解析后的Date类型的时间<br>  
  91.      *        若不能解析则返回当前日期<br>  
  92.      *        若给定为时间格式 则返回的日期为 1970年1月1日的日期  
  93.      *  
  94.      * bug: 此方法目前只能实现类似'yyyy-MM-dd'格式的日期的转换,<br>  
  95.      *       而'yyyyMMdd'形式的日期,则不能实现  
  96.      */    
  97.          
  98.     parseDate: function(strDate, strFormat){    
  99.        if(typeof strDate != 'string'){    
  100.             return new Date();    
  101.        }    
  102.       var longTime = Date.parse(strDate);    
  103.       if(isNaN(longTime)){    
  104.           if(strFormat == undefined){    
  105.               this.debug('请输入日期的格式');    
  106.              return new Date();    
  107.           }    
  108.           var tmpDate = new Date();    
  109.           var regFormat = /(\w{4})|(\w{2})|(\w{1})/g;    
  110.           var regDate = /(\d{4})|(\d{2})|(\d{1})/g;    
  111.           var formats = strFormat.match(regFormat);    
  112.           var dates = strDate.match(regDate);    
  113.           if( formats != undefined &&  dates != undefined && formats.length == dates.length){    
  114.             for(var i = 0; i < formats.length; i++){    
  115.               var format = formats[i];    
  116.               if(format === 'yyyy'){    
  117.                 tmpDate.setFullYear(parseInt(dates[i], 10));    
  118.               }else if(format == 'yy'){    
  119.                 var prefix = (tmpDate.getFullYear() + '').substring(0, 2);    
  120.                 var year = (parseInt(dates[i], 10) + '').length == 4? parseInt(dates[i], 10): prefix + (parseInt(dates[i], 10) + '00').substring(0, 2);    
  121.                 var tmpYear = parseInt(year, 10);    
  122.                 tmpDate.setFullYear(tmpYear);    
  123.               }else if(format == 'MM' || format == 'M'){    
  124.                 tmpDate.setMonth(parseInt(dates[i], 10) - 1);    
  125.               }else if(format == 'dd' || format == 'd'){    
  126.                 tmpDate.setDate(parseInt(dates[i], 10));    
  127.               }else if(format == 'HH' || format == 'H'){    
  128.                 tmpDate.setHours(parseInt(dates[i], 10));    
  129.               }else if(format == 'mm' || format == 'm'){    
  130.                 tmpDate.setMinutes(parseInt(dates[i], 10));    
  131.               }else if(format == 'ss' || format == 's'){    
  132.                 tmpDate.setSeconds(parseInt(dates[i], 10));    
  133.               }    
  134.             }    
  135.            return tmpDate;    
  136.          }    
  137.           return tmpDate;    
  138.         }else{    
  139.           return new Date(longTime);    
  140.         }    
  141.     },    
  142.         
  143.         
  144.     /**  
  145.      * 根据给定的时间间隔类型及间隔值,以给定的格式对给定的时间进行计算并格式化返回  
  146.      * @params date 要操作的日期时间可以为时间的字符串或者{@see Date}类似的时间对象,  
  147.      * @params interval 时间间隔类型如:"YEAR"、"MONTH"、 "DATE", 不区分大小写  
  148.      * @params amount 时间间隔值,可以正数和负数, 负数为在date的日期减去相应的数值,正数为在date的日期上加上相应的数值  
  149.      * @params strFormat 当输入端的date的格式为字符串是,此项必须输入。若date参数为{@see Date}类型是此项会作为最终输出的格式。  
  150.      * @params targetFormat 最终输出的日期时间的格式,若没有输入则使用strFormat或者默认格式'yyyy-MM-dd HH:mm:ss'  
  151.      * @return 返回计算并格式化后的时间的字符串  
  152.      */    
  153.     changeDate: function(date, interval, amount, strFormat, targetFormat){    
  154.         var tmpdate = new Date();    
  155.         if(date == undefined){    
  156.            this.debug('输入的时间不能为空!');    
  157.            return new Date();    
  158.         }else if(typeof date == 'string'){    
  159.             tmpdate = this.parseDate(date, strFormat);    
  160.         }else if(date instanceof Date){    
  161.           tmpdate = date;    
  162.         }    
  163.         var field  =  (typeof interval == 'string')? interval.toUpperCase(): 'DATE';    
  164.             
  165.         try{    
  166.           amount = parseInt(amount + '', 10);    
  167.           if(isNaN(amount)){    
  168.              amount = 0;    
  169.           }    
  170.         }catch(e){    
  171.            this.debug('你输入的[amount=' + amount + ']不能转换为整数');    
  172.            amount = 0;    
  173.         }    
  174.         switch(field){    
  175.            case this.DEFAULT_YEAR:    
  176.              tmpdate.setFullYear(tmpdate.getFullYear() + amount);    
  177.              break;    
  178.            case this.DEFAULT_MONTH:    
  179.              tmpdate.setMonth(tmpdate.getMonth() + amount);    
  180.              break;    
  181.            case this.DEFAULT_DATE:    
  182.              tmpdate.setDate(tmpdate.getDate() + amount);    
  183.              break;    
  184.            case this.DEFAULT_HOUR:    
  185.              tmpdate.setHours(tmpdate.getHours() + amount);    
  186.              break;    
  187.            case this.DEFAULT_MINUTE:    
  188.              tmpdate.setMinutes(tmpdate.getMinutes() + amount);    
  189.              break;    
  190.            case this.DEFAULT_SECOND:    
  191.               tmpdate.setSeconds(tmpdate.getSeconds() + amount);    
  192.              break;    
  193.            default:    
  194.               this.debug('你输入的[interval:' + field + '] 不符合条件!');            
  195.         }    
  196.             
  197.         this.curDate = tmpdate;    
  198.         return this.formatCurrentDate(targetFormat == undefined? strFormat: targetFormat);    
  199.     },    
  200.         
  201.     /**  
  202.      * 比较两个日期的差距  
  203.      * @param date1 Date类型的时间  
  204.      * @param date2 Dete 类型的时间  
  205.      * @param isFormat boolean 是否对得出的时间进行格式化,<br>   
  206.      *       false:返回毫秒数,true:返回格式化后的数据  
  207.      * @return 返回两个日期之间的毫秒数 或者是格式化后的结果  
  208.      */    
  209.     compareTo: function(date1, date2, isFormat){    
  210.       try{    
  211.             var len = arguments.length;    
  212.             var tmpdate1 = new Date();    
  213.             var tmpdate2 = new Date();    
  214.             if(len == 1){    
  215.                tmpdate1 = date1;    
  216.             }else if(len >= 2){    
  217.               tmpdate1 = date1;    
  218.               tmpdate2 = date2;    
  219.             }    
  220.         if(!(tmpdate1 instanceof Date) || !(tmpdate2 instanceof Date)){    
  221.            return 0;    
  222.         }else{    
  223.             var time1 = tmpdate1.getTime();     
  224.             var time2 = tmpdate2.getTime();    
  225.             var time = Math.max(time1, time2) - Math.min(time1, time2);    
  226.             if(!isNaN(time) && time > 0){    
  227.                if(isFormat){    
  228.                   var date = new Date(time);    
  229.                   var result = {};    
  230.                   result['year']   = (date.getFullYear() - 1970) > 0? (date.getFullYear() - 1970): '0';    
  231.                   result['month']  = (date.getMonth() - 1) > 0? (date.getMonth() - 1): '0';    
  232.                   result['day']    = (date.getDate() - 1) > 0? (date.getDate() - 1): '0';    
  233.                   result['hour']   = (date.getHours() - 8) > 0? (date.getHours() - 1): '0';    
  234.                   result['minute'] = date.getMinutes() > 0? date.getMinutes(): '0';    
  235.                   result['second'] = date.getSeconds() > 0? date.getSeconds(): '0';    
  236.                   return result;    
  237.                 }else {    
  238.                  return time;    
  239.                 }    
  240.             }else{    
  241.               return 0;    
  242.             }    
  243.         }    
  244.       }catch(e){    
  245.         this.debug('比较时间出现异常' + e.message);    
  246.       }    
  247.     },    
  248.         
  249.     /**  
  250.      * 根据给定的日期得到日期的月,日,时,分和秒的对象  
  251.      * @params date 给定的日期 date为非Date类型, 则获取当前日期  
  252.      * @return 有给定日期的月、日、时、分和秒组成的对象  
  253.      */    
  254.     getDateObject: function(date){    
  255.          if(!(date instanceof Date)){    
  256.            date = new Date();    
  257.          }    
  258.         return {    
  259.             'M+' : date.getMonth() + 1,     
  260.             'd+' : date.getDate(),       
  261.             'H+' : date.getHours(),       
  262.             'm+' : date.getMinutes(),     
  263.             's+' : date.getSeconds()    
  264.          };    
  265.     },    
  266.         
  267.     /**  
  268.      *在控制台输出日志  
  269.      *@params message 要输出的日志信息  
  270.      */    
  271.     debug: function(message){    
  272.        try{    
  273.            if(!this.isDebug){    
  274.              return;    
  275.            }    
  276.            if(!window.console){    
  277.                window.console = {};    
  278.                window.console.log = function(){    
  279.                   return;    
  280.                }    
  281.            }    
  282.            window.console.log(message + ' ');    
  283.        }catch(e){    
  284.        }    
  285.     }    
  286. }    
  287. </pre><br>  
  288. <pre></pre>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值