Internet Explorer 11 ошибка вычисленного часового пояса - PullRequest
1 голос
/ 30 апреля 2019

Мне известно о происхождении проблемы, и я гуглил, как полдня, но так и не смог найти хороших обходных путей или решений для этого.

Наше приложение Angular 7+ использует часовой пояс Перехватчик , который выглядит следующим образом:

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Injectable } from '@angular/core';

@Injectable()
export class TimezoneInterceptor implements HttpInterceptor {

  constructor() {
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;

    if (timezone) {
      req = req.clone({
        setHeaders: {
          Timezone: timezone
        }
      });
    } else {
      console.error('Unknown Timezone!');
    }

    return next.handle(req);
  }

}

Internet Explorer 11 не поддерживает resolvedOptions().timeZone;, и я не знаю, что можно использовать вместо этого, чтобы сделатьон работает во всех браузерах.

Любая помощь приветствуется!

1 Ответ

1 голос
/ 30 апреля 2019

Действительно, это не поддерживается в IE 11. См. Таблицу совместимости Intl , в разделе «DateTimeFormat» затем «resolvedOptions (). TimeZone по умолчанию для среды хоста».

Если вы должны поддерживать IE 11, вам придется прибегнуть к старым методам угадывания часового пояса пользователя.Долгое время единственным надежным методом для этого был jsTimeZoneDetect .Однако он не поддерживается, поэтому я бы не рекомендовал его в наши дни.

Позже, Момент-часовой пояс добавил функцию moment.tz.guess().Поскольку это все еще поддерживается в определенной степени, это, вероятно, ваш единственный вариант.

Обе библиотеки будут использовать API Intl, когда он будет доступен, но затем обратятся к алгоритму, который запрашивает объект Date для различныхсмещения в определенные ключевые даты перехода на летнее время.Вот почему это «предположение».Обычно он довольно точный или, по крайней мере, близкий, но не всегда может определить точную настройку компьютера пользователя в определенных крайних случаях.

Другим недостатком является то, что эти библиотеки должны отправлять данные часового пояса в браузер,который идет с накладными расходами этого размера данных.Это несколько смягчается за счет использования одного из усеченных файлов данных, таких как moment-timezone-with-data-10-year-range.min.js.

Если вам не нужно поддерживать IE 11 и более старые браузеры, то вы можете просто напрямую использовать API Intl, как вы показали в своем вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...