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

IT技术 javascript timezone
2021-03-03 10:38:32

我知道如何获得时区偏移量,但我需要的是能够检测到诸如“美国/纽约”之类的东西。这甚至可能来自 JavaScript 还是我将不得不根据偏移量推测的东西?

6个回答

国际化API支持获取用户的时区,并支持目前所有的浏览器。

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

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

@DanielCompton 哦,我不知道这张表,感谢您再次更正。
2021-04-19 10:38:32
非常简单和不错的解决方案!
2021-05-02 10:38:32
很棒的解决方案。不想为此包含整个时刻时区插件。
2021-05-06 10:38:32
太棒了,我见过的第一个不使用时刻的!谢谢
2021-05-11 10:38:32
没想到这么简单
2021-05-13 10:38:32

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

如果您想要当前用户语言的时区名称,您可以从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)而不是名称。但我认为它仍然可以作为后备阅读。

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

这是一个很好的解决方案。我正在使用timeZoneName: 'short'来获取可以在 Java 后端使用的简短格式,例如 EST 或 GMT+0230。
2021-04-30 10:38:32

按名称检索时区(即“美国/纽约”)

moment.tz.guess();
在 IE11 中Intl.DateTimeFormat().resolvedOptions().timeZone返回undefined,但moment.tz.guess()返回正确的值
2021-05-03 10:38:32
是的,虽然 moment-js 也会为不支持该功能的“浏览器”猜测 TZ。:)
2021-05-05 10:38:32
请注意,它也可以在没有任何依赖关系的情况下进行: Intl.DateTimeFormat().resolvedOptions().timeZone
2021-05-11 10:38:32

您可以使用此脚本。 http://pelepim.bitbucket.org/jstz/

在此处分叉或克隆存储库。 https://bitbucket.org/pelepim/jstimezonedetect

包含脚本后,您可以获得 -jstz.olson.timezones变量中的时区列表

以下代码用于确定客户端浏览器的时区。

var tz = jstz.determine();
tz.name();

享受jstz!

当前用户语言的结果的简短可能性:

console.log(new Date().toLocaleDateString(undefined, {day:'2-digit',timeZoneName: 'long' }).substring(4));