如何在 JavaScript 中获取时区名称?

2022-08-30 01:20:54

我知道如何获得时区偏移量,但我需要的是能够检测“美国/纽约”之类的东西。这是否可能来自JavaScript,或者我必须根据偏移量进行估计?


答案 1

国际化 API 支持获取用户时区,并且所有当前浏览器都受支持

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)

请记住,在某些支持国际化 API 的旧版浏览器上,该属性设置为而不是用户的时区字符串。据我所知,在撰写本文时(2017年7月),除IE11之外的所有当前浏览器都将以字符串形式返回用户时区。timeZoneundefined


答案 2

大多数赞成的答案可能是获取时区的最佳方式,但是,根据定义返回IANA时区名称,这是英文的。Intl.DateTimeFormat().resolvedOptions().timeZone

如果您希望时区名称采用当前用户的语言,则可以从 的字符串表示形式中解析它,如下所示:Date

function getTimezoneName() {
  const today = new Date();
  const short = today.toLocaleDateString(undefined);
  const full = today.toLocaleDateString(undefined, { timeZoneName: 'long' });

  // Trying to remove date from the string in a locale-agnostic way
  const shortIndex = full.indexOf(short);
  if (shortIndex >= 0) {
    const trimmed = full.substring(0, shortIndex) + full.substring(shortIndex + short.length);
    
    // by this time `trimmed` should be the timezone's name with some punctuation -
    // trim it from both sides
    return trimmed.replace(/^[\s,.\-:;]+|[\s,.\-:;]+$/g, '');

  } else {
    // in some magic case when short representation of date is not present in the long one, just return the long one as a fallback, since it should contain the timezone's name
    return full;
  }
}

console.log(getTimezoneName());

在 Chrome 和 Firefox 中进行了测试。

当然,这在某些环境中不会按预期工作。例如,node.js 返回 GMT 偏移量(例如 ),而不是名称。但我认为它作为后备方案仍然是可读的。GMT+07:00

附言:在IE11中不起作用,就像解决方案一样。Intl...