从浏览器获取客户端时区

有一个可靠的方法来从客户端浏览器获得时区? 我看到以下链接,但我想要一个更强大的解决scheme。

使用JavaScript自动检测时区

JavaScript中的时区检测

看看这个版本库页面,这是有帮助的

下载jstz.min.js并添加一个函数到你的html页面

<script language="javascript"> function getTimezoneName() { timezone = jstz.determine() return timezone.name(); } </script> 

并从你的显示标签中调用这个函数

通常当人们在寻找“时区”时,只需要“UTC时差”。 例如,他们的服务器在UTC + 5,他们想知道他们的客户端正在UTC-8运行


在普通的旧javascript (new Date()).getTimezoneOffset()/60将返回当前小时偏移的小时数。

值得注意的是getTimezoneOffset()返回值(来自MDN文档)的符号中可能存在“gotcha”:

时区偏移量是UTC和本地时间之间的差值,以分钟为单位。 请注意,这意味着如果本地时区在UTC之后,则偏移量为正;如果在前,则偏移量为负值。 例如,对于UTC + 10:00(澳大利亚东部标准时间,符拉迪沃斯托克时间,查莫罗标准时间)时区,将返回-600。


不过,我build议你使用时间/date相关的Javascript代码的moment.js 。 在这种情况下,您可以运行以下命令获得ISO 8601格式化的UTC偏移量:

 > moment().format("Z") "-08:00" 

(可能会提到客户可以很容易地伪造这些信息。)

现在,最好的select可能就是mbayloon的回答 。

为了完整起见,应该提到有一个标准就是这样: Intl 。 你可以在Chrome中看到这个:

 > Intl.DateTimeFormat().resolved.timeZone "America/Los_Angeles" 

(这实际上并不遵循标准,这是坚持图书馆的另一个理由)

半年后,我们有一个内置的方式! 对于现代浏览器,我会使用:

 Intl.DateTimeFormat().resolvedOptions().timeZone 

它可能不适用于你需要支持的浏览器 ,如果是这样的话,我会回到之前答案中提到的一个库。

不适用于Firefox(51及以下)和IE浏览器https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions#Browser_compatibility

这是一个jsfiddle

它提供了当前用户时区的缩写。

这是代码示例

 var tz = jstz.determine(); console.log(tz.name()); console.log(moment.tz.zone(tz.name()).abbr(new Date().getTime())); 

我使用了一种类似于Josh Fraser所采用的方法,该方法确定浏览器与UTC的偏移时间,以及是否识别DST(但是从他的代码中可以稍微简化一下):

 var ClientTZ = { UTCoffset: 0, // Browser time offset from UTC in minutes UTCoffsetT: '+0000S', // Browser time offset from UTC in '±hhmmD' form hasDST: false, // Browser time observes DST // Determine browser's timezone and DST getBrowserTZ: function () { var self = ClientTZ; // Determine UTC time offset var now = new Date(); var date1 = new Date(now.getFullYear(), 1-1, 1, 0, 0, 0, 0); // Jan var diff1 = -date1.getTimezoneOffset(); self.UTCoffset = diff1; // Determine DST use var date2 = new Date(now.getFullYear(), 6-1, 1, 0, 0, 0, 0); // Jun var diff2 = -date2.getTimezoneOffset(); if (diff1 != diff2) { self.hasDST = true; if (diff1 - diff2 >= 0) self.UTCoffset = diff2; // East of GMT } // Convert UTC offset to ±hhmmD form diff2 = (diff1 < 0 ? -diff1 : diff1) / 60; var hr = Math.floor(diff2); var min = diff2 - hr; diff2 = hr * 100 + min * 60; self.UTCoffsetT = (diff1 < 0 ? '-' : '+') + (hr < 10 ? '0' : '') + diff2.toString() + (self.hasDST ? 'D' : 'S'); return self.UTCoffset; } }; // Onload ClientTZ.getBrowserTZ(); 

加载后,将执行ClientTZ.getBrowserTZ()函数,该函数设置:

  • ClientTZ.UTCoffset为浏览器在UTC时间内的时间偏移,以分钟为单位(例如,CST为-360分钟,相对于UTC为-6.0小时);
  • ClientTZ.UTCoffsetT'±hhmmD' (例如'-0600D' )forms的偏移量,其中DST为后缀, D为标准(非DST), S为后缀。
  • ClientTZ.hasDST (为true或false)。

ClientTZ.UTCoffset在几分钟而不是几个小时内提供,因为一些时区有小时小数偏移量(例如+0415)。

ClientTZ.UTCoffsetT背后的意图是将其用作时区表(这里未提供)的关键字,例如下拉列表<select>列表。

你可以使用时区来猜测时区:

 > moment.tz.guess() "America/Asuncion" 

不,没有可靠的方法,永远不会有。 你真的认为你可以信任客户吗?