AngularJS自定义过滤器无法在iOS和IE上运行

时间:2016-07-21 06:28:47

标签: 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.setTime(date.getTime()-offset*60000);
            return date.toISOString();
        };
    });

然后,我使用过滤器将日期转换为我的首选格式,并在HTML中显示如下。 (我已将Angular插值标记更改为[[ ]]以避免与Laravel的刀片语法{{ }}冲突

[[prescription.patient.first_name]] [[prescription.patient.last_name]]<br>
[[prescription.created_at | dateToISO | date:"EEEE, d/M/yy h:mm a"]]

除了 IE 之外,这适用于所有桌面浏览器。此外,这不适用于iOS中的浏览器(Safari / Chrome)。

使用IE以外的桌面浏览器

Working example on desktop browsers except IE

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

Not working on iOS browsers

重要

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

提前致谢!

1 个答案:

答案 0 :(得分:3)

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

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

为了解决这个问题,我提到了分配时间戳的this question,然后用它来创建日期对象。

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;
        };
    });