Date()显示无效日期

时间:2014-12-21 21:55:24

标签: javascript date

这是我的代码。我想将div下的日期值转换为日期字符串,并使用id=demo在该字符串的innerText部分下创建一个新日期。但是res显示Invalid Date。所以请帮我找出错误。

<!DOCTYPE html>
<html>

<body>

<div>
    &nbsp;Monday,&nbsp; December&nbsp;&nbsp;22,&nbsp;2014&nbsp;|&nbsp;03:05:01 AM
</div>

<button onclick="myFunction()">Try it</button>

<p id="demo"></p>

<script>
function myFunction() 
 {
  DivisionHoldingTime=document.getElementsByTagName("div");
  var matches = DivisionHoldingTime[0].innerText;  
  var res = new Date (matches.trim().replace(/\|/,""));//**See Code Below
  document.getElementById("demo").innerHTML =res;//Shows Invalid Date
 }


</script>

 </body>
 </html>

如果我用这个

替换这个陈述
 var res =new Date("Monday,  December  22, 2014 | 03:05:01 AM".trim().replace(/\|/,"")); 
// document.getElementById("demo").innerHTML =res;-Shows the  Date

然后它工作正常。然后,

为什么res在第一种情况下将结果显示为Invalid date?请为我找出错误。

2 个答案:

答案 0 :(得分:1)

最后,经过大量搜索后,我的问题得到了解决。res显示Invalid Date的原因是innerText无法删除字符串{{1}从字符串。当我替换代码

&nbsp;

  var res = new Date (matches.trim().replace(/\|/,"")); 

工作正常。

答案 1 :(得分:0)

不确定正则表达式,我使用:

/\w+,\s+\w+\s+\d{1,2},\s+\d{4}\s+\|\s+\d{2}:\d{2}:\d{2}\s+[ap]m/ig;

应手动解析匹配的字符串以生成Date对象,您可以使用以下内容:

// s is string in format DDD, MMM dd, dddd | hh:mm:ss ap
function parseString(s) {
  s = s.toLowerCase();
  var b = s.match(/[\w]+/g);
  var months = {january:0, february:1, march:2, april:3, may:4, june:5,
                july:6, august:7, september:8, october:9, november:10, december:11};
  return new Date(b[3], months[b[1]], b[2], ((b[7]=='am'? 0 : 12) + b[4]%12), b[5], b[6]);
}

然后函数变为:

function myFunction() {
  var all_DivTags = document.querySelectorAll("div");
  var dateMatcherRegEx = /\w+,\s+\w+\s+\d{1,2},\s+\d{4}\s+\|\s+\d{2}:\d{2}:\d{2}\s+[ap]m/i;

  for (i=0, iLen=all_DivTags.length; i<iLen; i++) {

    if (dateMatcherRegEx.test(all_DivTags[i].textContent)) {
      divisionHoldingTime = all_DivTags[i].textContent.match(dateMatcherRegEx)[0];
      break;
    }
  }

  document.getElementById("demo").innerHTML = parseString(divisionHoldingTime);
}

请注意,按照惯例,只有构造函数的名称以大写字母开头(尽管常量可能包含所有大写字母的名称)。