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

时间:2012-03-19 15:27:04

标签: javascript timezone

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

9 个答案:

答案 0 :(得分:106)

Internationalization API支持获取用户时区,并且在所有当前浏览器中均为supported

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

请记住,在支持Internationalization API的某些旧版浏览器上,timeZone属性设置为undefined而不是用户的时区字符串。据我所知,在撰写本文时(2017年7月),all current browsers except for IE11会将用户时区作为字符串返回。

答案 1 :(得分:6)

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

在这里分叉或克隆存储库。 https://bitbucket.org/pellepim/jstimezonedetect

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

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

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

享受jstz!

答案 2 :(得分:2)

您可以使用此处的映射表编写自己的代码: http://www.timeanddate.com/time/zones/

或使用moment-timezone库: http://momentjs.com/timezone/docs/

请参阅zone.name; // America/Los_Angeles

或者,这个库: https://github.com/Canop/tzdetect.js

答案 3 :(得分:1)

尝试此代码参考here

<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>

答案 4 :(得分:0)

最受支持的answer可能是获取时区的最佳方法,但是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)而不是名称。但是我认为它仍然可以理解为后备。

P.S。不会像Intl...解决方案那样在IE11中工作。

答案 5 :(得分:0)

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

moment.tz.guess();

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:-4)

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

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

时刻&#39;时区将是一个有用的工具。 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