1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/**
* @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;
}
}