关于javascript:从浏览器获取客户端时区

get client time zone from browser

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

使用JavaScript自动检测时区

JavaScript中的时区检测


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

1
2
const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tz);

这将返回IANA时区字符串,但不返回偏移量。在MDN参考资料中了解更多信息。

兼容性表 - 截至2019年3月,适用于全球90%的浏览器。在Internet Explorer上不起作用。


看看这个存储库pageloom它是有帮助的

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

1
2
3
4
5
<script language="javascript">
    function getTimezoneName() {
        timezone = jstz.determine()
        return timezone.name();
    }

并从您的显示标签调用此功能


通常当人们在寻找"时区"时,只需"UTC偏移"即可。例如,他们的服务器是UTC + 5,他们想知道他们的客户端是以UTC-8运行的。

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

值得注意的是getTimezoneOffset()返回值(来自MDN docs)的符号中可能出现的"陷阱":

The time-zone offset is the difference, in minutes, between UTC and local time. Note that this means that the offset is positive if the local timezone is behind UTC and negative if it is ahead. For example, for time zone UTC+10:00 (Australian Eastern Standard Time, Vladivostok Time, Chamorro Standard Time), -600 will be returned.

但是,我建议您将day.js用于与时间/日期相关的Javascript代码。在这种情况下,您可以通过运行以下方式获得ISO 8601格式的UTC偏移:

1
2
> dayjs().format("Z")
"-08:00"

可能会提到客户端可以轻易伪造此信息。

(注意:这个答案最初推荐https://momentjs.com/,但是dayjs是一个更现代,更小的选择。)


目前,最好的选择可能是mbayloon的回答中建议的jstz。

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

1
2
> Intl.DateTimeFormat().resolvedOptions().timeZone
"America/Los_Angeles"

(这实际上并不遵循标准,这是坚持使用库的另一个原因)


这是一个jsfiddle

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

这是代码示例

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


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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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'),其中DST的后缀D,标准(非DST)的后缀S;
  • ClientTZ.hasDST(对于true或false)。

ClientTZ.UTCoffset以分钟而非数小时提供,因为一些时区具有小数小时偏移(例如,+ 0415)。

ClientTZ.UTCoffsetT背后的意图是将其用作时区表(此处未提供)的键,例如用于下拉列表