如何收集访问者的时区信息?

我两者都需要:

时区(例如,欧洲/伦敦) 与UTC或GMT的偏移(例如,UTC+01)


当前回答

时区(小时)-

var offset = new Date().getTimezoneOffset(); 如果(抵消< 0) console.log("您的时区是- GMT+" + (offset/-60)); 其他的 console.log("您的时区是- GMT-" + offset/60);

如果你想要像你在评论中提到的那样精确,那么你应该这样尝试-

var offset = new Date().getTimezoneOffset(); 如果(偏移<0) { var extraZero = “”; if(-offset%60<10) extraZero=“0”; console.log( “Your timezone is- GMT+” + Math.ceil(offset/-60)+“:”+extraZero+(-offset%60)); } 还 { var extraZero = “”; if(偏移量%60<10) extraZero=“0”; console.log( “Your timezone is- GMT-” + Math.floor(offset/60)+“:”+extraZero+(offset%60)); }

其他回答

时区(小时)-

var offset = new Date().getTimezoneOffset(); 如果(抵消< 0) console.log("您的时区是- GMT+" + (offset/-60)); 其他的 console.log("您的时区是- GMT-" + offset/60);

如果你想要像你在评论中提到的那样精确,那么你应该这样尝试-

var offset = new Date().getTimezoneOffset(); 如果(偏移<0) { var extraZero = “”; if(-offset%60<10) extraZero=“0”; console.log( “Your timezone is- GMT+” + Math.ceil(offset/-60)+“:”+extraZero+(-offset%60)); } 还 { var extraZero = “”; if(偏移量%60<10) extraZero=“0”; console.log( “Your timezone is- GMT-” + Math.floor(offset/60)+“:”+extraZero+(offset%60)); }

使用偏移量来计算时区是一种错误的方法,您总是会遇到问题。时区和夏令时规则可能会在一年中发生几次变化,并且很难跟上变化。

要获得JavaScript格式的系统IANA时区,您应该使用

控制台日志(Intl DateTimeFormat resolvedOptions()()。timeZone)

截至2023年2月,全球93.75%的浏览器都能正常运行。

旧的兼容性信息

ecma-402/1.0说timeZone如果没有提供给构造函数,可能是未定义的。然而,未来的草案(3.0)通过更改系统默认时区修复了这个问题。

在此版本的ECMAScript国际化API中, 如果没有timeZone属性,则timeZone属性将保持未定义 提供在提供给Intl的options对象中。DateTimeFormat 构造函数。但是,应用程序不应该依赖于此,因为未来 版本可能返回一个String值,用于标识主机环境 改为当前时区。

在ecma-402/3.0草案中,它被改成了

在此版本的ECMAScript 2015国际化API中 如果没有,timeZone属性将是默认时区的名称 属性在options对象中提供 Intl。DateTimeFormat构造函数。上一版本的 timeZone属性在本例中未定义。

试试这个,

new Date().toString().split("GMT")[1].split(" (")[0]

编辑3-19-2022 -警告:我不再推荐这种方法,因为它在多个浏览器和地区有问题。

我意识到这个答案有点离题,但我想我们中的许多人在寻找答案时也想格式化显示的时区,也许还想获得时区的缩写。所以它开始了…

如果你想让客户端时区格式化得很好,你可以依赖JavaScript Date。toString方法,执行以下操作:

var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];

这将为您提供“GMT-0400 (EST)”,例如,包括适用的时区分钟。

或者,使用regex你可以提取任何想要的部分:

“GMT-0400 (EDT)”:

new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]

对于“GMT-0400”:

new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]

对于“EDT”:

new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]

对于“-0400”:

new Date().toString().match(/([-\+][0-9]+)\s/)[1]

日期。toString参考:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString

编辑10/6/2020 -上述解决方案可能不适用于所有浏览器和地区。如果可能的话,我建议你使用date-fns、luxon或dayjs这样的javascript库来提供时区支持。

为什么不直接使用:

function timezoneOffset(date: Date) {
  return 6000 * ((date.getUTCHours() - date.getHours()) * 60 + ((date.getUTCMinutes() - date.getMinutes())))
}