Я создал следующий фильтр, чтобы преобразовать даты 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 следующим образом. (Я изменил теги угловой интерполяции на [[ ]]
чтобы избежать конфликтов с синтаксисом blade-сервера 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 и выше. Но я использую v.5.5 и все еще проблема. Об этой ситуации в браузерах iOS не было известно в Интернете. Может ли кто-нибудь объяснить, почему это происходит и как это решить?
Заранее спасибо!
Я, наконец, нашел причину проблемы. Я использовал var date = new Date(input);
где ввод находится в формате Ymd H:i:s
который является меткой времени MySQL.
JavaScript использует Date.parse
при создании объекта Date из метки времени. В настольных версиях многих браузеров они принимают отметки времени MySQL для создания объектов Date. Но в 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;
};
});
RangeError: Number expected
внутри анонимной функции в фильтре, упомянутом выше, околоreturn date.toISOString();