Javascript 从字符串中提取日期

Javascript 从字符串中提取日期,javascript,regex,node.js,datetime,Javascript,Regex,Node.js,Datetime,我正在尝试从一个字符串创建一个日期提取程序,以便在YouTube音乐会视频上一网打尽。许多视频标题的格式如下: PHISH Reba Comcast Center Hartford CT. 6/18/2010 Phish - It's Ice - November 30, 1991 PHISH - 11.30.91 I didn't know Phish/Worcester,MA 12-31-91 Llama Phish: Tube / Runaway Jim [HD] 2011-01-01 -

我正在尝试从一个字符串创建一个日期提取程序,以便在YouTube音乐会视频上一网打尽。许多视频标题的格式如下:

PHISH Reba Comcast Center Hartford CT. 6/18/2010
Phish - It's Ice - November 30, 1991
PHISH - 11.30.91 I didn't know
Phish/Worcester,MA 12-31-91 Llama
Phish: Tube / Runaway Jim [HD] 2011-01-01 - New York, NY
Phish - Stash (Live) 12.29.93
这些只是其中的几个例子。基本上,日期可以是从:
MM-DD-YYYY
MM-DD-YY
YY-MM-DD
等等。每个MM和DD可以是一个或两个字符。每个YYYY可以是2或4个字符。
-
字符从句点到破折号再到斜杠,可以通过正则表达式中简单的
/.?/
来固定

我首先剥离空白,然后在字符串上运行这个简单的正则表达式:

str.replace((new RegExp(' ', 'g')), '').match(/(([0-9]{1,4}).?([0-9]{1,2}).?([0-9]{1,4}))/)

// to highlight the regex:
// (([0-9]{1,4}).?([0-9]{1,2}).?([0-9]{1,4}))
这似乎工作得很好,但我还必须包括关于数字是年份、月份、日期等的逻辑,以及检测误报

此外,虽然我不希望能够将“11月2日”检测为11/2,但这将很酷:)

有人能给我一点建议或提出解决方案吗?我不想用图书馆。。。我宁愿为此编写特定的代码,因为它不太复杂。谢谢

这是一个测试环境(打开控制台查看结果),这样您就可以轻松地处理数据

这是我的尝试(与)

函数格式日期(日期){
函数lz(值,w){
value=value.toString();
返回“0000”。切片(4-w+值。长度)+值;
}
返回[
lz(date.getFullYear(),4),
lz(date.getMonth()+1,2),
lz(date.getDate(),2)
]。加入(“-”);
}
//支持短(XdYdZ)和长(月、日、年)的RegExp
var reDate=new RegExp([
“(?:”,//短格式
“\\b”,
“(\\d{4}|\\d{1,2})”,//field.short_value_1
“\\s*([./-])\\s*”,//field.short\u del_1
“(\\d{1,2})”,//field.short\u value\u 2
“\\s*([./-])\\s*”,//field.short\u del 2
“(\\d{4}|\\d{1,2})”,//field.short_value_3
“\\b”,
“)|(?:”,//长格式
“\\b”,
“(”,//field.long\u月
“jan(?:uary)?|”,
“二月(?:乡村)?|”,
“mar(?:ch)?|”,
“四月(?:日)?|”,
“五月|”,
“jun(?:e)?|”,
“七月(?:年)?|”,
“八月(?:ust)?|”,
“九月?”,
“十月?”,
“十一月(?:余烬)?|”,
“十二月(?:余烬)?”,
')',
“\\s+”,//所需空间
“(\\d{1,2})\\b',//field.long\u date
“\\s*”,//可选空格
“,?”,//可选分隔符
“\\s*”,//可选空间
“(\\d{4}|\\d{2}\\b',//field.long\u year
')'
].join(“”),“i”);
//月份名称,必须为3个字符小写。
//用于将月份名称转换为数字。
var monthNames=[
‘一月’、‘二月’、‘三月’、‘四月’、‘五月’、‘六月’,
‘七月’、‘八月’、‘九月’、‘十月’、‘十一月’、‘发展’
];
var extractDateFromString=函数(str){
var m=str.match(reDate);
风险值日期;
如果(m){
var-idx=-1;
//将数组形式的regexp结果转换为命名变量。
//使更改regexp变得更加容易
//更改代码的其余部分。
变量字段={
全部:m[++idx],
短_值_1:m[++idx],
short_del_1:m[++idx],
短_值_2:m[++idx],
short_del_2:m[++idx],
短_值_3:m[++idx],
长_月:m[++idx],
长_日期:m[++idx],
长_年:m[++idx]
}
//如果设置了field.long_month,则该日期的格式为命名月份
if(字段长\月){
var月=月数。指数(
field.long_month.slice(0,3).toLowerCase()
);
//TODO:为正常年份添加测试
//TODO:为sane月添加测试
//TODO:为sane date添加测试
日期=新日期(字段长\年、月、字段长\日期);
}否则{
//简短格式:值1删除值1删除值2删除值3
年、月、日;
if(field.short\u del\u 1!=field.short\u del\u 2){
如果(
field.short_del_1==='/'&&
field.short_del_2==='-'
) {
//年月日
年份=field.short\u value\u 3;
月=field.short_值_2;
day=field.short_value_1;
console.log('DMY',field.all,+年,+月,+日);
}否则{
//TODO:在此处添加其他格式。
//如果分隔符不匹配,则不是正常日期。
log(“不同的分隔符”);
}
}否则{
//假想词
//(分隔符='-'和值_3<31)
//或(值_1>31)
如果(
(field.short_del_1='-'| | field.short_值_1>31)
&&(field.short_值_3<32)
) {
//YMD
年份=field.short\u value\u 1;
月=field.short_值_2;
day=field.short_value_3;
console.log('YMD',field.all,+年,+月,+日);
}否则{
//MDY
年份=field.short\u value\u 3;
月份=field.short\u value\u 1;
day=field.short_value_2;
console.log('MDY',field.all,+年,+月,+日);
}
}
如果(年份!==未定义){
年份=+年份;//转换为数字
//百年不遇
//00-49年=2000-2049年,50-99年=1950-1999年
如果(年份<100){
年份+=年份<50?2000:1900;
}
日期=新日期(年+月1+日);
}
} 
}
var div=document.createElement('div');
div.className=日期?'pass':'fail';
div.appendChild(document.createTextNode(日期?格式日期(日期):'NaD'));
div.appendChild(document.createTextNode(“”+str));
文件.正文.附件(div);
}
对于(变量i=0;i
更新:调整了长格式的regexp(已添加\b)


更新:再次调整了regexp。没有更多的3位字段。(1、2或4)

javascript已经有一个日期对象:

试试这个:

var d = new Date(dateString);
你怎么知道
var d = new Date(dateString);