从浏览器获取客户端时区
有一个可靠的方法来从客户端浏览器获得时区? 我看到以下链接,但我想要一个更强大的解决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"
不,没有可靠的方法,永远不会有。 你真的认为你可以信任客户吗?