我制作了一个小脚本来进行检测。它首先注册可用时区的 ID,然后在调用该matches
函数时测试当前时间的所有时区 ID,以及 4 个月和 8 个月后(以过滤出具有不同日光规则的时区)和五年前的时间.
这里是 :
<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>
如果您只想要一个时区 ID,只需使用
var tzid = tzdetect.matches()[0];
示范
GitHub 存储库:https ://github.com/Canop/tzdetect.js
更新:此处显示的代码与最新版本的 moment.js 不兼容。请参阅GitHub 存储库以获取维护(免费使用)的代码。
2017 年更新: moment.js 中现在有一个 API 来猜测时区。这可能是目前最好的解决方案。