javascript - Internet Explorer 11 计算时区错误

标签 javascript angular typescript timezone internet-explorer-11

我知道问题的根源,并在谷歌上搜索了半天,但仍然找不到任何好的解决方法或解决方案。

我们的 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; 并且我不知道可以使用什么来使其在所有浏览器上运行.

感谢每一个帮助!

最佳答案

事实上,IE 11 不支持此功能。请参阅 Intl Compatibility Chart ,在“DateTimeFormat”下,然后“resolvedOptions().timeZone 默认为主机环境”。

如果您必须支持 IE 11,那么您需要采用旧的方法来猜测用户的时区。长期以来,jsTimeZoneDetect ,是唯一可靠的方法。然而,它没有得到维护,所以我现在不推荐它。

稍后,Moment-Timezone添加了 moment.tz.guess() 函数。由于这仍然在一定程度上得到维持,这可能是您唯一的选择。

两个库都会在可用时使用 Intl API,但随后会回退到一种算法,该算法询问 Date 对象以获取某些关键 DST 转换日期的各种偏移量。这就是为什么这是一个“猜测”。它通常非常准确,或者至少接近,但在某些边缘情况下无法始终识别用户计算机的准确设置。

另一个缺点是这些库必须将时区数据发送到浏览器,这会带来该数据大小的开销。通过使用 chop 的数据文件之一(例如 moment-timezone-with-data-10-year-range.min.js)可以在一定程度上缓解这种情况。

如果您不必支持 IE 11 及更早版本的浏览器,那么您可以直接使用 Intl API,如您在问题中所示。

关于javascript - Internet Explorer 11 计算时区错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55914911/

相关文章:

javascript - Angular 2,Auth0 未捕获语法错误 : Unexpected token <

javascript - 如何在 JSX/TSX 中使用 TypeScript 的转译函数

typescript - 为什么 TS 在一元算术运算中不安全,但在二进制算术运算中不安全?

javascript - 在 chrome.browserAction.onClicked 上调用内容脚本函数

javascript - Vue.js $children 按组件名称

javascript - 在android webview中删除网页的某些部分然后显示它

Angular react 形式 : valueChanges doesn't work as expected

javascript - 如何在自定义元素或按钮小部件上触发事件?

Angular 9 - NGCC 因未处理的异常而失败

javascript - 如何在 angular5 html 文件中显示以下对象?