我创建了以下过滤器来转换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以外的桌面浏览器
不适用于iOS浏览器和IE浏览器。而是显示原始角度代码。
重要:
当我搜索时,我发现IE的问题在Angular v1.3.3及更高版本中得到了解决。但是我正在使用v1.5.5 ,问题仍然存在。互联网上没有关于iOS浏览器上这种情况的线索。任何人都可以解释为什么会发生这种情况以及如何解决这个问题?
提前致谢!
答案 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;
};
});