下面为您提供了一个函数,该函数为您描述的格式生成解析器。 dateParser('yyyy/mm/dd')('1990-03-25') 是 { y: 1990, m: 3, d: 25 }。
您也可以使用chain 函数从而chain([dateParser('mm/dd/yyyy'), dateParser('yyyy-mm-dd')])('2014-04-04') 按顺序尝试格式。
var patterns = {
yyyy: '\\d{4}',
yy: '\\d{2}',
mm: '0\\d|1[012]',
m: '0?\\d|1[012]',
dd: '[3][01]|[012]\\d',
d: '[3][01]|[012]?\\d',
HH: '[2][0-4]|[01][0-9]',
H: '[2][0-4]|[01]?[0-9]',
hh: '[1][0-2]|0\\d',
h: '[1][0-2]|0?\\d',
MM: '[0-5]\\d',
M: '[0-5]?\\d',
ss: '[0-5]\\d',
s: '[0-5]?\\d'
}
function dateParser(pattern) {
var groupToFieldNames = [null];
var regexPattern = pattern.replace(
/([A-Za-z]+)|[.?+*\[\]\(\)\{\}^$\|\\]/g,
function (m, field, punc) {
if (patterns.hasOwnProperty(field)) {
groupToFieldNames.push(field[0]);
return '(' + patterns[field] + ')';
} else if (punc) {
return '\\' + punc;
} else {
return m;
}
});
var regex = new RegExp('^' + regexPattern + '$');
return function (dateString) {
var match = dateString.match(regex);
if (match) {
var fields = {};
for (var i = 1, n = groupToFieldNames.length; i < n; ++i) {
fields[groupToFieldNames[i]] = parseInt(match[i], 10);
}
return fields;
}
};
}
function chain(parsers) {
var arr = parsers.slice(0);
return function (x) {
for (var i = 0, n = arr.length; i < n; ++i) {
var result = (0,arr[i])(x);
if (result) { return result; }
}
};
}
console.log(JSON.stringify(
dateParser('yyyy/mm/dd H:MM:ss')('2014/12/31 7:30:25')
));
console.log(JSON.stringify(
chain([dateParser('mm/dd/yyyy'), dateParser('yyyy-mm-dd')])
('2014-04-04')
));