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

AngularJS custom filter not working on iOS and IE

我创建了以下过滤器来转换 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 的 blade 语法冲突 {{ }}

[[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 之外的桌面浏览器上工作

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

重要:

我搜索的时候发现IE的问题在Angularv1.3.3及以上版本已经解决了。但是 我使用的是 v1.5.5,但问题仍然存在。在 iOS 浏览器上,Internet 上没有关于这种情况的线索。谁能解释为什么会这样以及如何解决这个问题?

提前致谢!

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

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