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

使用javascript以正确的格式解析字符串,javascript,date-parsing,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) 非常感谢您的帮助。我不知道您从哪里得到了日期。parse调用,Ja

我有一个字符串,它的格式是: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)

非常感谢您的帮助。

我不知道您从哪里得到了
日期。parse
调用,JavaScript的
日期。parse
没有第二个参数

要做到这一点,您需要自己解析字符串,或者使用或类似的方法来解析字符串。如果您想自己解析它,您可能需要一个正则表达式和一个查找表(用于月份名称)。正则表达式将遵循以下思路:

var parts = /^\s*(\d+)\s+([A-Za-z]+)\s+(\d+)\s*$/.exec(str);
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));
    }
}
…在这里,您将以
parts[0]
作为日期,
parts[1]
作为月份名称,
parts[2]
作为年份。然后将月份转换为小写或大写,并使用查找表将月份名称映射为月份编号,大致如下:

var parts = /^\s*(\d+)\s+([A-Za-z]+)\s+(\d+)\s*$/.exec(str);
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
对象。(同样,还有libs可以在那里提供帮助。)


或者,当然,永远不要实际创建一个
日期
,而直接从
部分
格式化。我不知道从哪里得到
日期。parse
调用,JavaScript的
日期。parse
没有第二个参数

要做到这一点,您需要自己解析字符串,或者使用或类似的方法来解析字符串。如果您想自己解析它,您可能需要一个正则表达式和一个查找表(用于月份名称)。正则表达式将遵循以下思路:

var parts = /^\s*(\d+)\s+([A-Za-z]+)\s+(\d+)\s*$/.exec(str);
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));
    }
}
…在这里,您将以
parts[0]
作为日期,
parts[1]
作为月份名称,
parts[2]
作为年份。然后将月份转换为小写或大写,并使用查找表将月份名称映射为月份编号,大致如下:

var parts = /^\s*(\d+)\s+([A-Za-z]+)\s+(\d+)\s*$/.exec(str);
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
对象。(同样,也有LIB可以提供帮助。)

或者,当然,永远不要实际创建
日期
,而只是直接从
部分

格式化。这不是工作原理,它只需要一个参数,并返回一个unix时间戳

如果需要对象,请使用
新日期

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;
这不是工作原理,它只需要一个参数,然后返回一个unix时间戳

如果需要对象,请使用
新日期

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;

Date.parse
只接受一个参数。
Date.parse
只接受一个参数。
var myDate=新日期(“2012年5月7日”)使用不受支持的未指定格式,可能无法跨浏览器可靠工作。中唯一的格式是为ES5添加的,并且根本不使用月份名称(由于明显的区域设置原因)。我预计上述功能在法语本地化浏览器上会失败(尽管我手边没有)。在任何情况下,你都会依赖于未记录的行为。@T.J.Crowder:Mozilla说
new Date
(和
Date.parse
)也支持RFC 2822日期。浏览器可以随意超越标准。例如,我测试了“YYYY/dd/mm”,发现它在IE6(以及Firefox、Chrome、Opera、Midori和其他一些)中一直是可靠的。仍然没有记录,但是嘿。但这并不涉及月份名称,这在我看来似乎很不可靠。@Rocket:它碰巧起作用了。在您使用的浏览器的品牌和版本中。在您的区域设置中。虫子就是这样发生的,伙计!:-)@Rocket:是的,我以前是这样做的,但它已经多年没有更新了,并且有一些格式的错误,所以我开始建议使用MomentJS使用不受支持的未指定格式,可能无法跨浏览器可靠工作。中唯一的格式是为ES5添加的,并且根本不使用月份名称(由于明显的区域设置原因)。我预计上述功能在法语本地化浏览器上会失败(尽管我手边没有)。在任何情况下,你都会依赖于未记录的行为。@T.J.Crowder:Mozilla说
new Date
(和
Date.parse
)也支持RFC 2822日期。浏览器可以随意超越标准。例如,我测试了“YYYY/dd/mm”,发现它在IE6(以及Firefox、Chrome、Opera、Midori和其他一些)中一直是可靠的。仍然没有记录,但是嘿。但这并不涉及月份名称,这在我看来似乎很不可靠。@Rocket:它碰巧起作用了。在您使用的浏览器的品牌和版本中。在您的区域设置中。虫子就是这样发生的,伙计!:-)@Rocket:是的,我以前是这样做的,但是它已经多年没有更新了,并且在解析某些格式的字符串时出现了错误,所以我开始建议使用MomentJS。嗨,谢谢你的回答,但是解析对我来说总是没有定义。@Ana:对不起,我忘了索引0是整个字符串匹配(“2012年5月7日”),后面是捕获组。所以所有的指数都是一比一。修复。谢谢T.J.Crowder,我会试试。您好,谢谢您的回答,但解析对我来说总是未定义。@安娜:对不起,我忘了索引0是整个字符串匹配(“2012年5月7日”),后面是捕获组。所以所有的指数都是一比一。修好了。谢谢T.J.克劳德,我会试试的。