JS日期處理工具類
/*** 此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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!