1

我有一个始终采用这种格式的字符串: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)

非常感谢您的帮助。

4

2 回答 2

2

我不知道你从哪里Date.parse打来的电话,JavaScriptDate.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-26T14:25:31.817 回答
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');
于 2012-07-26T14:25:49.350 回答