使用`new Date`解析日期字符串时出错

时间:2016-08-31 08:19:29

标签: javascript date

datefromJSON = req.body.occasion_date;
occasion_date = new Date(datefromJSON);
console.log(occasion_date);

//while running this i get log like this 
//"Invalid Date"

当我从req.body获取json数据然后保存在datefromJSON var中,并且存储到数据库中我用来转换为Date对象获取错误

1 个答案:

答案 0 :(得分:3)

您的日期字符串( "31-08-2016")不是Date构造函数识别的格式。因此,您最终获得了Date,其基础时间值为NaN,显示为"无效日期"当你要求字符串版本。无端的例子:



console.log(new Date("foobar").toString());




only format规范要求支持的JavaScript实现是2009年ES5规范中添加的实现,其目的是(实际上是ES2015; ES5中存在错误)子集ISO-8601。例如:



console.log(new Date("2016-08-31T09:25").toString());




我也遇到非正式的每个JavaScript实现都支持使用斜杠MM/dd/yyyy解析美国格式(即使在非美国语言环境中),但时区也不同(大多数人将其解释为当地时间,其他人则将其解释为GMT)。

所以你需要:

  • 解析您的字符串(正则表达式,split等),并使用支持单独提供部分的Date构造函数的形式。请注意月份值从0 = 1月开始(不是1 = 1月)。有几十个问题,这里有关于SO的例子。以下是将常见的< dd-MM-yyyy HH:mm:ss or 'dd-MM-yyyy HH:mm:ss.SSS格式解析为本地日期/时间的示例:

    正则表达式基于:



function parseIt(str) {
  var rex = /^\s*(\d{1,2})[\/-](\d{1,2})[\/-](\d{4})(?: (\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:\.(\d{1,3}))?)?)?)?\s*$/;
  var parts = rex.exec(str);
  var dt = null;
  if (parts) {
    dt = new Date(+parts[3], // Year
      +parts[2] - 1, // Month
      +parts[1], // Day
      +parts[4] || 0, // Hours
      +parts[5] || 0, // Minutes
      +parts[6] || 0, // Seconds
      +parts[7] || 0 // Milliseconds
    );
  }
  return dt;
}

function test(str) {
  var dt = parseIt(str);
  console.log(str, "=>");
  console.log("   " + String(dt));
  console.log("   (" + (dt ? dt.toISOString() : "null") + ")");
}

test("foobar");
test("31-08-2016");
test("31/08/2016");
test("31/08/2016 9");
test("31/08/2016 9:25");
test("31/08/2016 09:25");
test("31/08/2016 09:25:17");
test("31/08/2016 09:25:17.342");




正则表达式看起来很复杂,但它实际上只是嵌套在非捕获的可选组中的一堆捕获组。 Explanation here.

  • 使用一个库(如MomentJS),通过说明格式是什么来解析字符串。