JS日期處理工具類

jopen 10年前發布 | 37K 次閱讀 JS JavaScript開發

    /**

 * 此JS文件是格式化JS中日期時間的工具類,其中包含了傳入日期對象Date,格式化成想要的格式,<br>  
 * 或者傳入字符串格式的時間個,次字符串日期對應的格式可以轉換為相應的日期對象,<br>  
 * 可以計算兩個日期之間的差值  
 *   
 * y: 表示年  
 * M:表示一年中的月份 1~12  
 * d: 表示月份中的天數 1~31  
 * H:表示一天中的小時數 00~23  
 * m: 表示小時中的分鐘數 00~59  
 * s: 表示分鐘中的秒數   00~59  
 */    

  var DateFormat = function(bDebug){    
      this.isDebug = bDebug || false;    
      this.curDate = new Date();    
  }    
 DateFormat.prototype = {    
    //定義一些常用的日期格式的常量     
    DEFAULT_DATE_FORMAT: 'yyyy-MM-dd',    
    DEFAULT_MONTH_FORMAT: 'yyyy-MM',    
    DEFAULT_YEAR_FORMAT: 'yyyy',    
    DEFAULT_TIME_FORMAT: 'HH:mm:ss',    
    DEFAULT_DATETIME_FORMAT: 'yyyy-MM-dd HH:mm:ss',    
    DEFAULT_YEAR: 'YEAR',    
    DEFAULT_MONTH: 'MONTH',    
    DEFAULT_DATE: 'DATE',    
    DEFAULT_HOUR: 'HOUR',    
    DEFAULT_MINUTE: 'MINUTE',    
    DEFAULT_SECOND: 'SECOND',    

    /**  
     * 根據給定的日期時間格式,格式化當前日期  
     * @params strFormat 格式化字符串, 如:"yyyy-MM-dd" 默認格式為:“yyyy-MM-dd HH:mm:ss”  
     * @return 返回根據給定格式的字符串表示的時間日期格式<br>  
     *         如果傳入不合法的格式,則返回日期的字符串格式{@see Date#toLocaleString()}  
     */    
     formatCurrentDate: function(strFormat){    
       try{    
          var tempFormat = strFormat == undefined? this.DEFAULT_DATETIME_FORMAT: strFormat;    
          var dates = this.getDateObject(this.curDate);    
          if(/(y+)/.test(tempFormat)){    
             var fullYear = this.curDate.getFullYear() + '';    
             var year = RegExp.$1.length == 4? fullYear: fullYear.substr(4 - RegExp.$1.length);    
             tempFormat = tempFormat.replace(RegExp.$1, year);    
          }    
          for(var i in dates){    
             if(new RegExp('(' + i + ')').test(tempFormat)){    
                var target = RegExp.$1.length == 1? dates[i]: ('0' + dates[i]).substr(('' + dates[i]).length - 1);    
                tempFormat = tempFormat.replace(RegExp.$1, target);    
             }    
          }    
          return tempFormat === strFormat? this.curDate.toLocaleString(): tempFormat;    
       }catch(e){    
          this.debug('格式化日期出現異常:' + e.message);    
       }    
    },    


    /**  
     * 根據給定的格式,把給定的時間進行格式化  
     * @params date 要格式化的日期  
     * @params strFormat 要得到的日期的格式的格式化字符串,如:'yyyy-MM-dd',默認:yyyy-MM-dd HH:mm:ss  
     * @return 根據規定格式的時間格式  
     *    
     * @updateDate 2011-09-15  
     */    
    format: function(date, strFormat){    
     try{    
        if(date == undefined){    
           this.curDate = new Date();    
        }else if(!(date instanceof Date)){    
           this.debug('你輸入的date:' + date + '不是日期類型');    
           return date;    
        }else{    
           this.curDate = date;    
        }    
        return this.formatCurrentDate(strFormat);    
     }catch(e){    
        this.debug('格式化日期出現異常:' + e.message);    
     }    
    },    

    /**  
     * 根據給定的格式對給定的字符串日期時間進行解析,  
     * @params strDate 要解析的日期的字符串表示,此參數只能是字符串形式的日期,否則返回當期系統日期  
     * @params strFormat 解析給定日期的順序, 如果輸入的strDate的格式為{Date.parse()}方法支持的格式,<br>  
     *         則可以不傳入,否則一定要傳入與strDate對應的格式, 若不傳入格式則返回當期系統日期。  
     * @return 返回解析后的Date類型的時間<br>  
     *        若不能解析則返回當前日期<br>  
     *        若給定為時間格式 則返回的日期為 1970年1月1日的日期  
     *  
     * bug: 此方法目前只能實現類似'yyyy-MM-dd'格式的日期的轉換,<br>  
     *       而'yyyyMMdd'形式的日期,則不能實現  
     */    

    parseDate: function(strDate, strFormat){    
       if(typeof strDate != 'string'){    
            return new Date();    
       }    
      var longTime = Date.parse(strDate);    
      if(isNaN(longTime)){    
          if(strFormat == undefined){    
              this.debug('請輸入日期的格式');    
             return new Date();    
          }    
          var tmpDate = new Date();    
          var regFormat = /(\w{4})|(\w{2})|(\w{1})/g;    
          var regDate = /(\d{4})|(\d{2})|(\d{1})/g;    
          var formats = strFormat.match(regFormat);    
          var dates = strDate.match(regDate);    
          if( formats != undefined &&  dates != undefined && formats.length == dates.length){    
            for(var i = 0; i < formats.length; i++){    
              var format = formats[i];    
              if(format === 'yyyy'){    
                tmpDate.setFullYear(parseInt(dates[i], 10));    
              }else if(format == 'yy'){    
                var prefix = (tmpDate.getFullYear() + '').substring(0, 2);    
                var year = (parseInt(dates[i], 10) + '').length == 4? parseInt(dates[i], 10): prefix + (parseInt(dates[i], 10) + '00').substring(0, 2);    
                var tmpYear = parseInt(year, 10);    
                tmpDate.setFullYear(tmpYear);    
              }else if(format == 'MM' || format == 'M'){    
                tmpDate.setMonth(parseInt(dates[i], 10) - 1);    
              }else if(format == 'dd' || format == 'd'){    
                tmpDate.setDate(parseInt(dates[i], 10));    
              }else if(format == 'HH' || format == 'H'){    
                tmpDate.setHours(parseInt(dates[i], 10));    
              }else if(format == 'mm' || format == 'm'){    
                tmpDate.setMinutes(parseInt(dates[i], 10));    
              }else if(format == 'ss' || format == 's'){    
                tmpDate.setSeconds(parseInt(dates[i], 10));    
              }    
            }    
           return tmpDate;    
         }    
          return tmpDate;    
        }else{    
          return new Date(longTime);    
        }    
    },    


    /**  
     * 根據給定的時間間隔類型及間隔值,以給定的格式對給定的時間進行計算并格式化返回  
     * @params date 要操作的日期時間可以為時間的字符串或者{@see Date}類似的時間對象,  
     * @params interval 時間間隔類型如:"YEAR"、"MONTH"、 "DATE", 不區分大小寫  
     * @params amount 時間間隔值,可以正數和負數, 負數為在date的日期減去相應的數值,正數為在date的日期上加上相應的數值  
     * @params strFormat 當輸入端的date的格式為字符串是,此項必須輸入。若date參數為{@see Date}類型是此項會作為最終輸出的格式。  
     * @params targetFormat 最終輸出的日期時間的格式,若沒有輸入則使用strFormat或者默認格式'yyyy-MM-dd HH:mm:ss'  
     * @return 返回計算并格式化后的時間的字符串  
     */    
    changeDate: function(date, interval, amount, strFormat, targetFormat){    
        var tmpdate = new Date();    
        if(date == undefined){    
           this.debug('輸入的時間不能為空!');    
           return new Date();    
        }else if(typeof date == 'string'){    
            tmpdate = this.parseDate(date, strFormat);    
        }else if(date instanceof Date){    
          tmpdate = date;    
        }    
        var field  =  (typeof interval == 'string')? interval.toUpperCase(): 'DATE';    

        try{    
          amount = parseInt(amount + '', 10);    
          if(isNaN(amount)){    
             amount = 0;    
          }    
        }catch(e){    
           this.debug('你輸入的[amount=' + amount + ']不能轉換為整數');    
           amount = 0;    
        }    
        switch(field){    
           case this.DEFAULT_YEAR:    
             tmpdate.setFullYear(tmpdate.getFullYear() + amount);    
             break;    
           case this.DEFAULT_MONTH:    
             tmpdate.setMonth(tmpdate.getMonth() + amount);    
             break;    
           case this.DEFAULT_DATE:    
             tmpdate.setDate(tmpdate.getDate() + amount);    
             break;    
           case this.DEFAULT_HOUR:    
             tmpdate.setHours(tmpdate.getHours() + amount);    
             break;    
           case this.DEFAULT_MINUTE:    
             tmpdate.setMinutes(tmpdate.getMinutes() + amount);    
             break;    
           case this.DEFAULT_SECOND:    
              tmpdate.setSeconds(tmpdate.getSeconds() + amount);    
             break;    
           default:    
              this.debug('你輸入的[interval:' + field + '] 不符合條件!');            
        }    

        this.curDate = tmpdate;    
        return this.formatCurrentDate(targetFormat == undefined? strFormat: targetFormat);    
    },    

    /**  
     * 比較兩個日期的差距  
     * @param date1 Date類型的時間  
     * @param date2 Dete 類型的時間  
     * @param isFormat boolean 是否對得出的時間進行格式化,<br>   
     *       false:返回毫秒數,true:返回格式化后的數據  
     * @return 返回兩個日期之間的毫秒數 或者是格式化后的結果  
     */    
    compareTo: function(date1, date2, isFormat){    
      try{    
            var len = arguments.length;    
            var tmpdate1 = new Date();    
            var tmpdate2 = new Date();    
            if(len == 1){    
               tmpdate1 = date1;    
            }else if(len >= 2){    
              tmpdate1 = date1;    
              tmpdate2 = date2;    
            }    
        if(!(tmpdate1 instanceof Date) || !(tmpdate2 instanceof Date)){    
           return 0;    
        }else{    
            var time1 = tmpdate1.getTime();     
            var time2 = tmpdate2.getTime();    
            var time = Math.max(time1, time2) - Math.min(time1, time2);    
            if(!isNaN(time) && time > 0){    
               if(isFormat){    
                  var date = new Date(time);    
                  var result = {};    
                  result['year']   = (date.getFullYear() - 1970) > 0? (date.getFullYear() - 1970): '0';    
                  result['month']  = (date.getMonth() - 1) > 0? (date.getMonth() - 1): '0';    
                  result['day']    = (date.getDate() - 1) > 0? (date.getDate() - 1): '0';    
                  result['hour']   = (date.getHours() - 8) > 0? (date.getHours() - 1): '0';    
                  result['minute'] = date.getMinutes() > 0? date.getMinutes(): '0';    
                  result['second'] = date.getSeconds() > 0? date.getSeconds(): '0';    
                  return result;    
                }else {    
                 return time;    
                }    
            }else{    
              return 0;    
            }    
        }    
      }catch(e){    
        this.debug('比較時間出現異常' + e.message);    
      }    
    },    

    /**  
     * 根據給定的日期得到日期的月,日,時,分和秒的對象  
     * @params date 給定的日期 date為非Date類型, 則獲取當前日期  
     * @return 有給定日期的月、日、時、分和秒組成的對象  
     */    
    getDateObject: function(date){    
         if(!(date instanceof Date)){    
           date = new Date();    
         }    
        return {    
            'M+' : date.getMonth() + 1,     
            'd+' : date.getDate(),       
            'H+' : date.getHours(),       
            'm+' : date.getMinutes(),     
            's+' : date.getSeconds()    
         };    
    },    

    /**  
     *在控制臺輸出日志  
     *@params message 要輸出的日志信息  
     */    
    debug: function(message){    
       try{    
           if(!this.isDebug){    
             return;    
           }    
           if(!window.console){    
               window.console = {};    
               window.console.log = function(){    
                  return;    
               }    
           }    
           window.console.log(message + ' ');    
       }catch(e){    
       }    
    }    
}    </pre><br />
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!