Javascript AngularJS自定义过滤器不适用于iOS和IE

Javascript AngularJS自定义过滤器不适用于iOS和IE,javascript,ios,angularjs,internet-explorer,cross-browser,Javascript,Ios,Angularjs,Internet Explorer,Cross Browser,我创建了以下过滤器来转换MySQL日期,并调整时区相对于UTC的时间 angular.module('HIS') .filter('dateToISO', function () { return function (input) { var offset = new Date().getTimezoneOffset(); var date = new Date(input); date.setTim

我创建了以下过滤器来转换MySQL日期,并调整时区相对于UTC的时间

angular.module('HIS')
    .filter('dateToISO', function () {
        return function (input) {
            var offset = new Date().getTimezoneOffset();
            var date = new Date(input);
            date.setTime(date.getTime()-offset*60000);
            return date.toISOString();
        };
    });
然后,我使用过滤器将日期转换为我喜欢的格式,并在HTML中显示它们,如下所示。(我已将角度插值标记更改为
[[]]
,以避免与Laravel的刀片语法冲突
{}

[[处方.患者.姓名][[处方.患者.姓氏]]
[[prescription.created|u于| dateToISO |日期:“EEEE,d/M/yy h:mm a”]]
这适用于除IE之外的所有桌面浏览器。这也不适用于iOS(Safari/Chrome)中的浏览器

在除IE之外的桌面浏览器上工作

不适用于iOS浏览器和IE。显示原始角度代码

重要

当我搜索时,我发现IE的问题在Angular v1.3.3及更高版本中得到了解决。但是我使用的是v1.5.5,问题仍然存在。在iOS浏览器上,互联网上没有关于这种情况的线索。有人能解释为什么会发生这种情况以及如何解决吗


提前谢谢

我终于找到了问题的原因。我使用了
var date=新日期(输入)其中输入的格式为
Y-m-dh:i:s
,这是一个MySQL时间戳

当从时间戳创建日期对象时,JavaScript使用
Date.parse
。在许多浏览器的桌面版本中,它们接受MySQL时间戳来创建日期对象。但在iOS和IE中,这不起作用。对于使用字符串创建的日期,时间戳应采用
ISO
格式。因此,它不接受MySQL时间戳

为了解决这个问题,我提到了时间戳被拆分的位置,然后用于创建日期对象

angular.module('HIS')
    .filter('dateToISO', function () {
        return function (input) {
            var t = input.split(/[- :]/);
            var date = new Date(Date.UTC(t[0], t[1]-1, t[2], t[3], t[4], t[5]));
            return date;
        };
    });

我终于找到了问题的原因。我使用了
var date=新日期(输入)其中输入的格式为
Y-m-dh:i:s
,这是一个MySQL时间戳

当从时间戳创建日期对象时,JavaScript使用
Date.parse
。在许多浏览器的桌面版本中,它们接受MySQL时间戳来创建日期对象。但在iOS和IE中,这不起作用。对于使用字符串创建的日期,时间戳应采用
ISO
格式。因此,它不接受MySQL时间戳

为了解决这个问题,我提到了时间戳被拆分的位置,然后用于创建日期对象

angular.module('HIS')
    .filter('dateToISO', function () {
        return function (input) {
            var t = input.split(/[- :]/);
            var date = new Date(Date.UTC(t[0], t[1]-1, t[2], t[3], t[4], t[5]));
            return date;
        };
    });

浏览器在dev tools中登录到控制台的是什么?
RangeError:Number expected
在上面提到的过滤器中的匿名函数中,靠近
return date.toISOString()根据MSDN:“如果objDate不包含有效日期,则[在调用toISOString()时]引发RangeError异常。”。也许您可以检查offset、date.getTime()的值以及传递给setTime函数的整个值?这是不可能的。值是有效的。那么它是如何在chrome上工作的呢?在桌面上的Chrome浏览器上,同样的页面可以完美地工作。IE和iOS浏览器会出现问题。我刚刚读到IE在早期版本中不支持toISOString()方法。这可能是原因。浏览器在开发工具的控制台中登录了什么?
RangeError:Number expected
在上述过滤器中的匿名函数中,靠近
return date.toISOString()根据MSDN:“如果objDate不包含有效日期,则[在调用toISOString()时]引发RangeError异常。”。也许您可以检查offset、date.getTime()的值以及传递给setTime函数的整个值?这是不可能的。值是有效的。那么它是如何在chrome上工作的呢?在桌面上的Chrome浏览器上,同样的页面可以完美地工作。IE和iOS浏览器会出现问题。我刚刚读到IE在早期版本中不支持toISOString()方法。也许这就是原因。