我创建了以下过滤器来转换 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的问题在Angular v1.3.3及以上版本已经解决了。但是我使用的是 v1.5.5,问题仍然存在。 iOS 浏览器出现这种情况,网上没有任何线索。任何人都可以解释为什么会发生这种情况以及如何解决这个问题吗?
提前致谢!
最佳答案
我终于找到问题的原因了。我使用了 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;
};
});
关于javascript - AngularJS 自定义过滤器不适用于 iOS 和 IE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38496521/