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

我两者都需要:

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


当前回答

这可能不是最优雅的解决方案,但却是最通用的。

这使用了Intl的timeZoneName属性。DateTimeFormat

function getTimeZone(zoneName = "long") { // set up formatter let formatter = new Intl.DateTimeFormat(undefined, { timeZoneName: zoneName }); // run formatter on current date return formatter.formatToParts(Date.now()) // extract the actual value from the formatter, only reliable way i can find to do this .find(formatted => formatted.type === "timeZoneName")['value']; } // console.log every type for (const zoneName of ['short', 'long', 'shortOffset', 'longOffset', 'shortGeneric', 'longGeneric']) { console.log(`${zoneName}: ${getTimeZone(zoneName)}`) } /* short: CDT long: Central Daylight Time shortOffset: GMT-5 longOffset: GMT-05:00 shortGeneric: CT longGeneric: Central Time */

这不仅得到格式化的GMT偏移时间(即GMT-5),还得到时区的口语化名称(即中央日光时间)。

这个方法唯一不做的是获取IANA时区。我推荐上面的答案。

据我所知,DateTimeFormat没有自定义格式化的方法,因此使用formattpart,这似乎是获得时区的唯一可靠方法。

值得注意的是,目前的ECMAscript规范中只有short和long被正式定义,其他4个选项只是标准提议的一部分,在撰写本文时,safari中明显没有,尽管它正在进行中

其他回答

尝试Date对象的getTimezoneOffset():

var curdate = new Date()
var offset = curdate.getTimezoneOffset()

此方法返回时区偏移量(以分钟为单位),即GMT和本地时间之间的差值(以分钟为单位)。

试试这个:

new Date().toLocaleString("en-US",Intl.DateTimeFormat().resolvedOptions().timeZone)

这将在客户端的浏览器上查找timeZone。

用getTimezoneOffset ()

你可以像这样在几分钟内得到时区偏移量:

var offset = new Date().getTimezoneOffset(); console.log(抵消); //如果偏移量等于-60,则时区偏移量为UTC+01

时区偏移量是UTC和本地时间之间的差值,单位为分钟。注意,这意味着如果本地时区落后于UTC,则偏移量为正,如果落后于UTC,则偏移量为负。例如,如果您的时区是UTC+10(澳大利亚东部标准时间),则将返回-600。即使对于给定的区域,夏令时也可以防止此值为常量

Mozilla日期对象引用

请注意,并非所有时区都被整小时抵消:例如,纽芬兰是UTC减去3h 30m(将日光节约时间排除在等式之外)。

请注意,这只给你时区偏移(例如:UTC+01),它不给你时区(例如:欧洲/伦敦)。

使用momentjs,您可以找到当前时区为

console.log(时刻).utcOffset ());//(-240, -120, - 60,0, 60,120, 240,等等) < script src = " https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js " > < /脚本>


使用dayjs,您可以找到当前时区为

console.log(dayjs().utcOffset());(-240、-120、-60、0、60、120、240 等) <script src=“https://unpkg.com/dayjs@1.8.10/dayjs.min.js”></script>

这两个API都返回以分钟为单位的utc偏移量。

现在医生 Dayjs医生

为什么不直接使用:

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