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


116

我知道如何获取时区偏移量,但我需要的是能够检测“美国/纽约”之类的东西的能力。JavaScript甚至可能做到这一点吗?或者我将不得不根据偏移量来进行估计吗?


2
这里是一个功能乔恩·尼兰德写道,也许它可以帮助bitbucket.org/pellepim/jstimezonedetect
yunzen

这是一个可能有用
Douglas

Answers:


239

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

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

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


6
没想到它是如此简单
Mohammed Shareef C

5
太棒了,我见过的第一个没有用的瞬间!谢谢
r0bb077

3
很棒的解决方案。不想为此包括整个时刻的时区插件。
琼·吉尔

1
非常简单和不错的解决方案!
blackiii

2
@DanielCompton哦,我不知道这张桌子,感谢您再次纠正它。
CommonSenseCode

9

获得最高支持的答案可能是获取时区的最佳方法,但是,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不能像Intl...解决方案一样在IE11中工作。



3

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

moment.tz.guess();

9
请注意,它也完全可能没有任何依赖关系:Intl.DateTimeFormat().resolvedOptions().timeZone
user2923322

1
是的,尽管moment-js也猜测TZ是不支持该功能的“浏览器”。:)
Ferran Maylinch

在IE11中Intl.DateTimeFormat().resolvedOptions().timeZone返回undefined,但moment.tz.guess()返回正确的值
Antoni4


0

这会GMT在较旧的javascript中获取时区代码(例如)(我将google app脚本与旧引擎一起使用):

function getTimezoneName() {
  return new Date().toString().get(/\((.+)\)/);
}

我只是把这个放在这里,以防有人需要。


1
我认为这仅适用于UTC/ GMT。好像别人被阐明了;例如Pacific Daylight Time
伊恩·邓恩

-1

试试这个代码从这里参考

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
  $(document).ready(function(){
    var tz = jstz.determine(); // Determines the time zone of the browser client
    var timezone = tz.name(); //'Asia/Kolhata' for Indian Time.

    alert(timezone);
});
</script>

-5

在javascript中,Date.getTimezoneOffset()方法以分钟为单位返回当前语言环境相对于UTC的时区偏移量。

var x = new Date();
var currentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;

Moment'时区将是一个有用的工具。 http://momentjs.com/timezone/

在时区之间转换日期

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

4
您不了解que。
srsajid

3
您的代码示例与原始问题无关。您将如何使用该库返回用户当前时区的名称?
乔·怀特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.