【问题标题】:Chrome can't parse date but IE canChrome 无法解析日期,但 IE 可以
【发布时间】:2016-08-19 20:10:48
【问题描述】:

我在为我的网站解析日期时遇到问题。它曾经在 IE 和 Chrome 上运行良好(我还没有尝试过 Firefox)。但最近我无法在 chrome 上解析日期。

我从数据库中获取的日期字符串类似于“Oct 17 2016 12:00AM”

这是我用来调试问题的代码

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 返回的内容:

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

这是 Chrome 返回的内容:

字符串 = 2016 年 10 月 17 日上午 12:00
新日期 = 无效日期
日期解析 = 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 而不是字符串。

【问题讨论】:

  • 跨浏览器问题在解析值时很常见。最好的办法是使用像 moment.js 这样的库来进行解析,它已经考虑了大部分(如果不是全部)浏览器变量。此外,这不是您希望日期时间在来自服务器时的样子。您可能希望改进它们的存储方式。
  • 看起来 chrome 不喜欢 AM/PM 部分,您能否在将日期服务器端格式化为 UTC 后再将其发送回浏览器?更好的是,我建议只将日期作为 UTC 存储在您的数据库中。
  • 将日期作为字符串存储在数据库中是一个坏主意,当您没有具有正确日期时间列的数据库时,SQL 查询是不可能的。
  • @QBM5;需要注意的是,moment.js 的最新版本要求您在从字符串中解析日期时传递格式字符串,这正是由于跨浏览器问题。
  • 如果我添加一个空格,这适用于 chrome new Date("Oct 17 2016 12:00 AM")

标签: javascript google-chrome date internet-explorer


【解决方案1】:

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

使用提供解析和格式化的定制函数或库,并始终将要解析的格式传递给解析器。合适的库是moment.jsdate.jsfecha.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');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 2012-03-24
    • 2018-01-30
    相关资源
    最近更新 更多