使用javascript以正确的格式解析字符串

时间:2012-07-26 14:22:14

标签: javascript date-parsing

我有一个以这种格式的字符串:2012年5月7日或2012年5月17日 我的目标是解析此字符串并以此格式获取日期:yyyy-mm-dd

所以,我的例子2012年5月7日将成为2012-05-07,2012年5月17日将成为2012-05-17

我尝试过

Date.parse("7 May 2012", "yyyy-mm-dd") 

但结果是:

Sun May 20 2012 00:00:00 GMT+0200 (CEST)

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

我不知道你在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对象。 (再次,有libs可以帮助那里。)

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

答案 1 :(得分:2)

这不是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');