我正在尝试比较代表日期的两个字符串。
var val1 = "02-12-2015";
var val2 = "27-11-2015";
var date1 = new Date(val1);
var date2 = new Date(val2);
在date1中我得到了日期对象但在date2中我得到“无效日期” 有谁知道原因?
答案 0 :(得分:2)
new Date()
可以解析多种日期格式,但DD-MM-YYYY
不是其中之一。与字符串最匹配的格式为MM-DD-YYYY
,因此它会尝试将日期用作月份,反之亦然。这适用于你的第一个例子,但不适用于第二个例子。
您可以像这样转换日期:
var pattern = /(\d{2})-(\d{2})-(\d{4})/;
var date2 = new Date(val2.replace(pattern,'$3-$2-$1'));
格式YYYY-MM-DD
确保没有误解。
Date.parse()
documentation中描述了更多有效格式。
答案 1 :(得分:1)
您不应该使用Date构造函数来解析字符串,因为它非常不可靠。始终使用您自己的函数或库手动解析字符串。要解析OP中的格式并验证值,可以使用简单的函数,如:
function parseDMY(s) {
// Get the number parts
var b = s.split(/\D/);
// Create a date
var d = new Date(b[2], --b[1], b[0]);
// Check that it's a valid date. If not, return a Date with time value
// set to NaN (per ES5 and ECMAScript 2015 standards)
return b[1] == d.getMonth()? d : new Date(NaN);
}
document.write(parseDMY('02-12-2015'))

答案 2 :(得分:-2)
当传递一个字符串参数时,它是日期的字符串表示形式,采用Date.parse()方法接受的格式。 Date(dateString)构造函数接受RFC822和ISO 8601格式的日期字符串。
RFC822格式的日期字符串的示例包括"星期一,2005年8月15日15:52:01 EDT + 0000","' 25 December,2010 6:00:00 Am& #39;" " 2005年8月15日"。请注意,提供两位数的年份,如"星期一,05年8月15日15:52:01"不能在JavaScript中工作! 国际ISO(ISO 8601)规范定义了" YYYY-MM-DD"这消除了由dd / mm / yy和mm / dd / yy格式引起的模糊。例如,使用国际格式," 2002年4月3日"将表达为" 2002-04-03"。
日期构造函数和Date.parse()函数抛出错误。相反,它们会产生NaN值。 我们可以用它来测试日期的有效性。 下面的函数可以应用于任何字符串,以确定它是否代表可接受的日期格式:
String.prototype.isValidDate = function isValidDate() {
return !isNaN(Date.parse(this));
}
因此,根据RFC822和ISO 8601格式,使用字符串参数的新Date()似乎无效。