我首先会反转月份和日期的位置,为所有日期获取相同的格式:
function splitDate(input) {
return input.replace(
/^(\w+)-(\d+)/, '$2-$1'
).split('-');
}
var parts = splitDate('Feb-12-2012'); // ["12", "Feb", "2012"]
var parts = splitDate('12-Feb-2012'); // ["12", "Feb", "2012"]
var day = parts[0];
var month = parts[1];
var year = parts[2];
/^(\w+)-(\d+)/
仅匹配“Mmm-dd-yyyy”:
^ beginning of the input
(\w+) a word character, one or more times ($1)
- a dash
(\d+) a digit, one or more times ($2)
为了走得更远
现在您知道如何拆分输入,我想进一步将结果转换为 Date 对象。首先,让我们打开 Chrome 的控制台来快速检查输入是否可解析:
new Date('12-Feb-2012') // Sun Feb 12 2012...
new Date('Feb-12-2012') // Sun Feb 12 2012...
显然,Chrome 可以很好地完成这项工作。这很棒,但其他实现不一定具有相同的行为方式,您应该更好地依赖规范。幸运的是,有人已经帮你检查过了:未记录的支持 Date.parse 格式?
粗略地总结一下,解析您自己的格式的能力可能会因实现而异。只有一种可靠的格式,即YYYY-MM-DDTHH:mm:ss.sssZ
,其中每个字母(“T”和“Z”除外)都代表一个数字。
准确地说,MM
预计是一个数字。如果您想确保您的输入能够被正确解析,您必须找到一种方法将月份部分转换为数字。让我们尝试一下:
var months = {
Jan: '01', Feb: '02', Mar: '03', Apr: '04', May: '05', Jun: '06',
Jul: '07', Aug: '08', Sep: '09', Oct: '10', Nov: '11', Dec: '12'
};
var parts = splitDate('Feb-12-2012'); // ["12", "Feb", "2012"]
parts[1] = months[parts[1]]; // parts -> ["12", "02", "2012"]
还不错,工作快完成了。事实上,正如规范中提到的,解析器只接受日期格式,例如YYYY-MM-DD
,这很容易实现:
parts = parts.reverse(); // ["2012", "02", "12"]
parts = parts.join('-'); // "2012-02-12"
让我们看看控制台说什么:
new Date(parts) // Sun Feb 12 2012...
Done!
结案
或者,您可以这样做:
var parts = splitDate('Feb-12-2012'); // ["12", "Feb", "2012"]
parts[1] = months[parts[1]]; // parts -> ["12", "02", "2012"]
var date = new Date(parts[2], parts[1] - 1, parts[0]);
您可以通过将流程隐藏到函数中来更进一步:
function parseDate(input) {
var map = {
Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5,
Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11
};
return (parseDate = function (input) {
input = input.replace(/^(\w+)-(\d+)/, '$2-$1').split('-');
return new Date(input[2], map[input[1]], input[0]);
})(input);
};
用法示例:
var date = parseDate('12-Feb-2012'); // Sun Feb 12 2012...
var date = parseDate('Feb-12-2012'); // Sun Feb 12 2012...
请随时询问详情。