Пользовательский фильтр AngularJS не работает на iOS и IE

0

Я создал следующий фильтр, чтобы преобразовать даты 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

Изображение 174551

Не работает в браузерах iOS и IE. Вместо этого показан необработанный угловой код.

Изображение 174551

Важно:

Когда я искал, я обнаружил, что проблема с IE была решена в Angular v1.3.3 и выше. Но я использую v.5.5 и все еще проблема. Об этой ситуации в браузерах iOS не было известно в Интернете. Может ли кто-нибудь объяснить, почему это происходит и как это решить?

Заранее спасибо!

  • 0
    Что браузер входит в консоль в инструментах разработчика?
  • 0
    RangeError: Number expected внутри анонимной функции в фильтре, упомянутом выше, около return date.toISOString();
Показать ещё 2 комментария
Теги:
internet-explorer
cross-browser

1 ответ

3
Лучший ответ

Я, наконец, нашел причину проблемы. Я использовал 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;
        };
    });

Ещё вопросы

Сообщество Overcoder
Наверх
Меню