Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用moment.js检测当前用户时区的ID_Javascript_Timezone_Momentjs - Fatal编程技术网

Javascript 使用moment.js检测当前用户时区的ID

Javascript 使用moment.js检测当前用户时区的ID,javascript,timezone,momentjs,Javascript,Timezone,Momentjs,我要寻找的是一种检测浏览器时区ID的方法(如中所定义),但我不关心确切的ID,我只需要与用户的时区ID相同的时区ID(例如,如果用户在巴黎,“欧洲/罗马”就可以) 我对当前偏移量不感兴趣,我真的需要时区,这样我就可以将它发送到服务器,以便对其他日期进行计算(服务器也有Olson表) 理论上,因为我已经使用并包含了Olson表,所以我不需要其他任何东西,但是我找不到任何API来进行检测。我不知道它是藏在什么地方还是有人已经写好了。问题之一是当前的时区插件似乎将其数据保持为私有 我不想要一个基于奥尔

我要寻找的是一种检测浏览器时区ID的方法(如中所定义),但我不关心确切的ID,我只需要与用户的时区ID相同的时区ID(例如,如果用户在巴黎,“欧洲/罗马”就可以)

我对当前偏移量不感兴趣,我真的需要时区,这样我就可以将它发送到服务器,以便对其他日期进行计算(服务器也有Olson表)

理论上,因为我已经使用并包含了Olson表,所以我不需要其他任何东西,但是我找不到任何API来进行检测。我不知道它是藏在什么地方还是有人已经写好了。问题之一是当前的时区插件似乎将其数据保持为私有


我不想要一个基于奥尔森表(我必须维护)的另一个副本或摘录集成的解决方案,我知道有几个库在复制它们,我想使用我在矩.js中已有的库。

我制作了一个小脚本来进行检测。它首先注册可用时区的ID,然后在调用
matches
函数时测试当前时间以及4个月和8个月后(以过滤出具有不同日光规则的时区)和5年前的所有时区ID

这是:

<script src="moment-with-langs.min.js"></script>
<script src="moment-timezone.min.js"></script>
<script src="moment-timezone-data.js"></script>
<script>
var tzdetect = {
    names: moment.tz.names(),
    matches: function(base){
        var results = [], now = Date.now(), makekey = function(id){
            return [0, 4, 8, -5*12, 4-5*12, 8-5*12, 4-2*12, 8-2*12].map(function(months){
                var m = moment(now + months*30*24*60*60*1000);
                if (id) m.tz(id);
                return m.format("DDHHmm");
            }).join(' ');
        }, lockey = makekey(base);
        tzdetect.names.forEach(function(id){
            if (makekey(id)===lockey) results.push(id);
        });
        return results;
    }
};
</script>

GitHub存储库:

更新:此处显示的代码与moment.js的最新版本不兼容。有关维护(免费使用)代码,请参阅


2017年更新:现在,在moment.js中有一个API来猜测时区。这可能是目前最好的解决方案。

如果您想使用标准JavaScript API,可以在支持浏览器的地方使用:

Intl.DateTimeFormat().resolvedOptions().timeZone; // "America/Los_Angeles"
resolvedOptions
目前(2016年1月)可在所有浏览器中使用,iOS和桌面上的Safari除外:


但是,
timeZone
属性当前处于禁用状态。

有一个javascript工具可以实现以下功能:

它似乎也在处理时区模糊问题

结合momentJS时区,您可以获取时区并显示格式化日期:

var tzObj = jstz.determine();
var timezoneCode = tzObj.name();
console.log(moment.tz(timeZoneCode).format());

moment现在有
guess()
API作为@MattJohnson此插件包含时区数据的提取。这是我特别想要避免的。这不是一个真正的摘录,这些都是经过充分研究的测试点。有很多边缘情况需要考虑。我确实理解您坚持使用可维护数据的愿望,但我不确定是否可以采取直接的方法。此外,请确保您意识到这一点。js也受此影响。是ES5做错了。ES6更好,但现在几乎所有的浏览器都是ES5。另请参见技术上的,应该是
Intl.DateTimeFormat().resolvedOptions().timeZone
,但两者都可以。除当前版本外。@MattJohnson感谢您的帮助。不过,我仍然不确定,我不知道该规范在多大程度上可以被认为是成熟的。我没有足够详细的文件来描述它。你们有这样一份文件吗?这是一份报告的一部分,尚未定稿。我同意这还不够成熟,不适合今天使用。正如poster所说,这在Chrome和其他一些浏览器中有效,但支持不够完善,因此存在风险。例如,这不适用于Safari,这是一个很好的开始,但它需要一种方法来提供边缘情况的测试。你现在做的测试是合理的,但并不能涵盖所有内容。这将是一个优秀的GitHub项目,并且是一个插件我会考虑为Time.JS做贡献,但正如你所知道的(也许比我好多了),在我这样做之前,我得对这个话题做更多的工作。您在这里的警告非常受欢迎,可能对其他用户有用。@MattJohnson,现在,我做了。酷。如果我有时间,我将测试它并发送一个包含建议更改的请求。可能需要一段时间我才能开始。干杯@MartynDavis我合并了您的更改。谢谢,但我的要求正是“我不想要基于奥尔森表的另一个副本或摘录的集成的解决方案”。哦,很好。我想是时候不接受我自己的答案了:)
var tzObj = jstz.determine();
var timezoneCode = tzObj.name();
console.log(moment.tz(timeZoneCode).format());