JS无法创建日期对象

时间:2015-12-10 09:50:32

标签: javascript date

我正在尝试比较代表日期的两个字符串。

var val1 = "02-12-2015";
var val2 = "27-11-2015";

var date1 = new Date(val1);
var date2 = new Date(val2);

在date1中我得到了日期对象但在date2中我得到“无效日期” 有谁知道原因?

3 个答案:

答案 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()似乎无效。