用javascript格式解析正确的格式字符串
我有一个字符串,其格式为allways:2012年5月7日或2012年5月17日 我的目标是解析此字符串并以此格式获取日期:yyyy-mm-dd用javascript格式解析正确的格式字符串
所以,我的例子7 2012年5月将成为2012-05-07 17 2012年5月将成为2012-05-17
我已经tryed与
Date.parse("7 May 2012", "yyyy-mm-dd")
但结果是:
Sun May 20 2012 00:00:00 GMT+0200 (CEST)
非常感谢您的帮助。
我不知道你在哪里得到Date.parse
调用,JavaScript的Date.parse
没有第二个参数。
要做到这一点,你需要自己解析字符串,或使用MomentJS或类似的东西来为你做。如果你想自己解析它,你可能需要一个正则表达式和一个查找表(用于月份名称)。正则表达式将沿着这些路线:
var parts = /^\s*(\d+)\s+([A-Za-z]+)\s+(\d+)\s*$/.exec(str);
...在那里你会最终parts[0]
是,parts[1]
月份名称,并parts[2]
一年的日子。然后,只需转换当月大写或小写,并使用查找表来月份名称映射到月份数,东西沿着这些线路:
var months = {
"jan": 0,
"january": 0,
"feb": 1,
"february": 1,
"may": 4,
// ...
"dec": 11,
"december": 11
};
var parts = /^\s*(\d+)\s+([A-Za-z]+)\s+(\d+)\s*$/.exec(str);
var dt;
if (parts) {
parts[2] = months[parts[2].toLowerCase()];
if (typeof parts[2] !== "undefined") {
dt = new Date(parseInt(parts[3], 10),
parts[2],
parseInt(parts[1], 10));
}
}
然后,您可以格式化生成的Date
对象。 (再次,有库在那里帮助。)
或者,当然,从来没有实际制作Date
,只是直接从parts
格式。
嗨,谢谢你的回答,但解析总是没有定义给我。 – 2012-07-26 14:38:36
@Ana:对不起,我忘记了索引0是*整体*字符串匹配(“2012年5月7日”),紧接着是捕获组。所以所有的指数都是一个。固定。 – 2012-07-26 14:46:31
谢谢T.J.克劳德,我会试试看。 – 2012-07-26 14:47:41
这不是Date.parse
的工作方式,它只需要一个参数,它会返回一个unix时间戳。
如果您想要一个Date
对象,请使用new Date
。
var myDate = new Date("7 May 2012");
// Mon May 07 2012 00:00:00
然后你可以自己分析它成你想要的格式:
var year = myDate.getFullYear(),
month = myDate.getMonth() + 1, // month returns 0-11, not 1-12
day = myDate.getDate();
var dateStr = year + '-' + (month < 10 ? 0 : '') + month + '-' + (day < 10 ? 0 : '') + day;
注意:"7 May 2012"
是非标准的日期格式,可能无法在所有浏览器正常工作。
注2:要100%确定它可以在所有浏览器中工作,我会使用类似Datejs
的库。
// Using Date.js
var myDate = Date.parse('7 May 2012');
var dateStr = myDate.toString('yyyy-MM-dd');
'var myDate = new Date(“2012年5月7日”);'使用不支持的,未指定的格式,这可能无法可靠地跨浏览器工作。 [规范](http://ecma-international.org/ecma-262/5.1/#sec-15.9.1.15)中唯一的格式仅适用于ES5,并且根本不使用月份名称(对于明显的语言环境的原因)。我期望上述失败,比如法语本地化的浏览器(尽管我没有一个方便)。无论如何,你都会依赖无证行为。 – 2012-07-26 14:32:26
@ T.J.Crowder:Mozilla说''新Date'(和'Date.parse')也支持RFC 2822日期。 – 2012-07-26 14:36:08
@火箭:Mozilla没有定义这个标准(已经不再)。 ECMA确实。如果他们想要在规范中包含RFC 2822,他们会这么做。 – 2012-07-26 14:36:44
'Date.parse'只带一个参数。 – 2012-07-26 14:24:47