用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) 

非常感谢您的帮助。

+1

'Date.parse'只带一个参数。 – 2012-07-26 14:24:47

我不知道你在哪里得到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)); 
    } 
} 

Live example | source

然后,您可以格式化生成的Date对象。 (再次,有库在那里帮助。)

或者,当然,从来没有实际制作Date,只是直接从parts格式。

+0

嗨,谢谢你的回答,但解析总是没有定义给我。 – 2012-07-26 14:38:36

+1

@Ana:对不起,我忘记了索引0是*整体*字符串匹配(“2012年5月7日”),紧接着是捕获组。所以所有的指数都是一个。固定。 – 2012-07-26 14:46:31

+0

谢谢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'); 
+1

'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

+0

@ T.J.Crowder:Mozilla说''新Date'(和'Date.parse')也支持RFC 2822日期。 – 2012-07-26 14:36:08

+0

@火箭:Mozilla没有定义这个标准(已经不再)。 ECMA确实。如果他们想要在规范中包含RFC 2822,他们会这么做。 – 2012-07-26 14:36:44