date.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){
}
}
} 工具

相關文章
相關標籤/搜索