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 defaults to the host environment"。
如果您必须支持 IE 11,那么您将需要求助于猜测用户时区的旧方法。长期以来,jsTimeZoneDetect 是唯一可靠的方法。但是,它没有得到维护,所以这些天我不会推荐它。
后来Moment-Timezone增加了moment.tz.guess()
功能。由于这仍然在一定程度上得到维护,这可能是您唯一的选择。
两个库都将在 Intl
API 可用时使用,但随后会回退到一种算法,该算法会在某些关键的 DST 转换日期询问 Date
对象的各种偏移量。这就是为什么它是 "guess"。它通常非常准确,或者至少接近,但在某些边缘情况下不能始终识别用户计算机的确切设置。
另一个缺点是这些库必须将时区数据发送到浏览器,这会带来数据大小的开销。通过使用截断的数据文件之一,例如 moment-timezone-with-data-10-year-range.min.js
.
如果您不必支持 IE 11 和更旧的浏览器,那么您可以直接使用 Intl
API,如您在问题中所示。
我知道问题的根源并用谷歌搜索了半天,但仍然找不到任何好的解决方法或解决方案。
我们的 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 defaults to the host environment"。
如果您必须支持 IE 11,那么您将需要求助于猜测用户时区的旧方法。长期以来,jsTimeZoneDetect 是唯一可靠的方法。但是,它没有得到维护,所以这些天我不会推荐它。
后来Moment-Timezone增加了moment.tz.guess()
功能。由于这仍然在一定程度上得到维护,这可能是您唯一的选择。
两个库都将在 Intl
API 可用时使用,但随后会回退到一种算法,该算法会在某些关键的 DST 转换日期询问 Date
对象的各种偏移量。这就是为什么它是 "guess"。它通常非常准确,或者至少接近,但在某些边缘情况下不能始终识别用户计算机的确切设置。
另一个缺点是这些库必须将时区数据发送到浏览器,这会带来数据大小的开销。通过使用截断的数据文件之一,例如 moment-timezone-with-data-10-year-range.min.js
.
如果您不必支持 IE 11 和更旧的浏览器,那么您可以直接使用 Intl
API,如您在问题中所示。