Javascript 铬罐';我不能分析日期,但我可以

Javascript 铬罐';我不能分析日期,但我可以,javascript,google-chrome,date,internet-explorer,Javascript,Google Chrome,Date,Internet Explorer,我在解析网站的日期时遇到问题。它过去在IE和Chrome上都很好用(我还没有试过Firefox)。但最近我无法在chrome上解析日期 我从数据库中获取的日期字符串如下所示:“2016年10月17日12:00AM” 下面是我用来调试问题的代码 以下是IE返回的内容: 字符串=2016年10月17日上午12:00 新日期=2016年10月17日星期一00:00:00 GMT-0400(东部夏时制) 日期解析=1476676800000 力矩解析=1476676800000 以下是Chrome返回

我在解析网站的日期时遇到问题。它过去在IE和Chrome上都很好用(我还没有试过Firefox)。但最近我无法在chrome上解析日期

我从数据库中获取的日期字符串如下所示:“2016年10月17日12:00AM”

下面是我用来调试问题的代码

以下是IE返回的内容:

字符串=2016年10月17日上午12:00
新日期=2016年10月17日星期一00:00:00 GMT-0400(东部夏时制)
日期解析=1476676800000
力矩解析=1476676800000

以下是Chrome返回的内容:

字符串=2016年10月17日上午12:00
新日期=无效日期
日期解析=NaN
力矩解析=NaN

我在一个函数中使用Date.parse()来查找到日期之间的差异:

我应该如何处理我的日期字符串,才能使其与chrome和internet explorer一起工作

固定的


因此,我通过更改web api调用以返回日期时间而不是字符串来修复它。

永远不要使用日期构造函数(或Date.parse,它们在解析时是等效的)解析字符串,因为它几乎完全依赖于实现。即使是ECMA-262中指定的一种格式也不能被所有正在使用的浏览器可靠地解析

使用提供解析和格式化的定制函数或库,并始终将要解析的格式传递给解析器。合适的库是,和,但还有很多其他的

定制功能可能如下所示:

函数解析特殊{
变量月份={1月:0日,2月:1日,3月:2日,4月:3日,5月:4日,6月:5日,7月:6日,8月:7日,9月:8日,10月:9日,11月:10日,12月:11日};
var h;
如果(/a[mp]$/i.test){
h=/am$/i.测试?0:12;
s=s.replace(/a[mp]$/i,”);
}
var b=s.split(/[:]/)
返回新日期(b[2],月[b[0].toLowerCase().substr(0,3)],b[1],(b[3]%12)+h,b[4]);
}
var s=‘2016年10月17日上午12:00’;

console.log(parseSpecia)跨浏览器问题在解析值时很常见。最好的选择是使用一个库,比如moment.js来进行解析,它考虑了大部分(如果不是全部的话)浏览器变量。而且,当约会时间来自服务器时,这并不是您希望的样子。您可能希望改进它们的存储方式。看起来chrome不喜欢AM/PM部分,您能在将日期服务器端发送回浏览器之前将其格式化为UTC吗?更好的是,我建议在数据库中只将日期存储为UTC。在数据库中将日期存储为字符串是一个坏主意,如果数据库中没有合适的日期时间列,sql查询是完全不可能的。@QBM5;需要注意的是,最新版本的moment.js要求您在解析字符串中的日期时传递格式字符串,这正是因为跨浏览器问题。如果我添加空格,这在chrome
新日期(“2016年10月17日12:00 AM”)
console.log("String = "+item.DueDate);
console.log("new Date = " + new Date(item.DueDate));
console.log("Date Parse = " + Date.parse(item.DueDate));
console.log("Moment Parse = " + moment(item.DueDate));
function daydiff(first, second) {
    return Math.round((second - first) / (1000 * 60 * 60 * 24));
}

var dif = daydiff(Date.parse(item.DueDate), Date.parse(item.DateShipped));