使用javascript以正确的格式解析字符串
我有一个字符串,它的格式是:2012年5月7日或2012年5月17日 我的目标是解析这个字符串并以这种格式获取日期:yyyy-mm-dd 因此,我的示例2012年5月7日将成为2012-05-07,2012年5月17日将成为2012-05-17 我试过了使用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
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.克劳德,我会试试的。