dateFormat.js 4.4 KB
/** 
 * @param date 需要转换的日期(可以是字符串类型、数字类型和日期类型)
 * @param fmt  格式化格式,默认YYYY-MM-DD hh:mm:ss
 * @param type 传入的日期类型,datetime/date,默认datetime
 */
export default function (date, fmt = 'YYYY-MM-DD hh:mm:ss', type = 'datetime') {
    function dateToGMT(strDate) {
		const dateStr = strDate.split(' ');
        const strGMT = dateStr[0] + ' ' + dateStr[1] + ' ' + dateStr[2] + ' ' + dateStr[5] + ' ' + dateStr[3] + ' GMT+0800';
        return new Date(Date.parse(strGMT));
    }

    const nonpunctuation = /[^ -/:-@[-`{-~\t\n\rTZ]+/g;
    if (typeof date == 'string') {
		if (date.indexOf('GMT') > 0) {
			// 为兼容IE 并且时间格式为"Wed Jun 13 00:00:00 GMT+08:00 2018"
			if (date.indexOf(' GMT+08:00 ') > 0) {
			date = dateToGMT(date);
			} else {
			date = new Date(date);
			}
		} else if (date.indexOf('UTC') > 0) {  //UTC格式
			date = new Date(date);
		} else if (date.indexOf('CST') > 0) {  //CST格式
			date = dateToGMT(date);
		} else if (/^\d{4}(\/|-|,|\u5e74)\d{1,2}(\/|-|,|\u6708)\d{1,2}(\u65e5)?(,|\s)?\d{1,2}(\/|:|,|\u65f6)\d{1,2}(\/|:|,|\u5206)\d{1,2}(\u79d2)?$/.test(date)) {
			//  YYYY-MM-DD hh:mm:ss | YYYY,MM,DD hh,mm,ss | YYYY/MM/DD hh/mm/ss | YYYY年MM月DD日hh时mm分秒
			date = date.match(/[^ -/:-@\u5e74\u6708\u65e5\u65f6\u5206\u79d2[-`{-~\t\n\r]+/g);
			//date = new Date(date[0],parseInt(date[1])-1,date[2],date[3],date[4],date[5]);
			if (date.length <= 3) {
				date = new Date(date.join('/'))
			} else {
				if (date.length === 4) {
					date = new Date(date[0] + '/' + date[1] + '/' + date[2] + ' ' + date[3] + ':00:00')
				} else if (date.length === 5) {
					date = new Date(date[0] + '/' + date[1] + '/' + date[2] + ' ' + date[3] + ':' + date[4] + ':00')
				} else {
					date = new Date(date[0] + '/' + date[1] + '/' + date[2] + ' ' + date[3] + ':' + date[4] + ':' + date[5])
				}
			}
		} else if (/^[1,2]\d{3}[0,1]\d[0,1]\d\s?[0-2]\d[0-5]\d[0-5]\d$/.test(date)) {  //  YYYYMMDD hhmmss
			if (date.indexOf(' ') > 0) {
				date = new Date(date.substr(0,4)+'/'+date.substr(4,2)+'/'+date.substr(6,2)+' '+date.substr(9,2)+':'+date.substr(11,2)+':'+date.substr(13,2));
			} else {
				date = new Date(date.substr(0,4)+'/'+date.substr(4,2)+'/'+date.substr(6,2)+' '+date.substr(8,2)+':'+date.substr(10,2)+':'+date.substr(12,2));
			}
			
		} else if (/^[1,2]\d{3}[0,1]\d[0,1]\d$/.test(date)) {
			date = new Date(date.substr(0,4)+'/'+date.substr(4,2)+'/'+date.substr(6,2));
		} else if (!date.match(nonpunctuation)) {
			date = new Date(date);
		} else if (/^\d+$/.test(date)) {
			date = new Date(Number(date));
		}
    } else if (typeof date == 'number') {
        if (/^[1,2]\d{3}[0,1]\d[0,1]\d([0-2]\d[0-5]\d[0-5]\d)?$/.test(date)) {
			date = date.toString();
			if ('datetime' === type) {
				date = new Date(date.substr(0,4)+'/'+date.substr(4,2)+'/'+date.substr(6,2)+' '+date.substr(8,2)+':'+date.substr(10,2)+':'+date.substr(12,2));
			} else if ('date' === type){
				date = new Date(date.substr(0,4)+'/'+date.substr(4,2)+'/'+date.substr(6,2));
			}
			
        } else {
			date = new Date(date);
        }
    }
    
    if (!date || !(date instanceof Date) || isNaN(date.getTime())) {
        date = new Date();
    }

    if (fmt) {
        var o = {
            'M+': date.getMonth() + 1,
            'D+': date.getDate(),
            'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12,
            'H+': date.getHours(),
            'm+': date.getMinutes(),
            's+': date.getSeconds(),
            'q+': Math.floor((date.getMonth() + 3) / 3),
            'S': date.getMilliseconds()
        }
        var week = {
            '0': '\u65e5',
            '1': '\u4e00',
            '2': '\u4e8c',
            '3': '\u4e09',
            '4': '\u56db',
            '5': '\u4e94',
            '6': '\u516d'
        }
        if (/(Y+)/.test(fmt)) {
            fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
        }
        if (/(E+)/.test(fmt)) {
            fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '\u661f\u671f' : '\u5468') : '') + week[date.getDay() + ''])
        }
        for (var k in o) {
            if (new RegExp('(' + k + ')').test(fmt)) {
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
            }
        }
        return fmt;
    } else {
        return date;
    }
}