繁体   English   中英

Internet Explorer 11 计算时区错误

[英]Internet Explorer 11 computed timezone bug

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

我们的 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,但随后会退回到在某些关键 DST 转换日期查询Date对象的各种偏移量的算法。 这就是为什么它是一个“猜测”。 它通常非常准确,或者至少接近,但在某些极端情况下不能始终识别用户计算机的确切设置。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM