我在解析网站日期时遇到问题。它曾经在IE和Chrome上运行良好(我还没有尝试过Firefox)。但最近我无法解析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));
以下是IE返回的内容:
String = 2016年10月17日12:00 AM
新日期= 2016年10月17日星期一00:00:00 GMT-0400(东部夏令时间)
日期解析= 1476676800000
时刻分析= 1476676800000
以下是Chrome返回的内容:
String = 2016年10月17日12:00 AM
新日期=无效日期
日期解析= NaN
Moment Parse = NaN
我在我的一个函数中使用Date.parse()来查找日期之间的差异:
function daydiff(first, second) {
return Math.round((second - first) / (1000 * 60 * 60 * 24));
}
var dif = daydiff(Date.parse(item.DueDate), Date.parse(item.DateShipped));
我应该如何处理我的日期字符串才能使用chrome和Internet Explorer?
固定
所以我通过改变我的web api调用来修复它以返回DateTime而不是字符串。
答案 0 :(得分:2)
永远不要使用Date构造函数解析字符串(或Date.parse,它们等同于解析),因为它几乎完全依赖于实现。即使是ECMA-262中指定的一种格式也未被所有正在使用的浏览器可靠地解析。
使用定制函数或提供解析和格式化的库,并始终传递格式以解析解析器。合适的图书馆是moment.js,date.js和fecha.js,但还有很多其他图书馆。
定制功能可能如下所示:
function parseSpecia(s) {
var months = {jan:0,feb:1,mar:2,apr:3,may:4,jun:5,jul:6,aug:7,sep:8,oct:9,nov:10,dec:11};
var h;
if (/a[mp]$/i.test(s)) {
h = /am$/i.test(s)? 0 : 12;
s = s.replace(/a[mp]$/i,'');
}
var b = s.split(/[ :]/)
return new Date(b[2], months[b[0].toLowerCase().substr(0,3)], b[1],(b[3]%12)+h, b[4]);
}
var s = 'Oct 17 2016 12:00AM';
console.log(parseSpecia(s));
使用库看起来像:
fecha.parse('Oct 17 2016 12:00AM','MMM DD YYYY hh:mm:zz');