我需要确定JS中的客户端时区(例如CET,GMT,EST)。获得偏移很简单,但没有确定TZ所需的所有信息,至少不容易。我有一种感觉可能可以使用偏移的组合,无论DST是否在使用和生效等等,但我希望其他人已经完成了这项工作,特别是考虑到奇怪处理时间时的例外情况。
This question类似,但问题和答案都是基于(不正确的)假设,每个浏览器的DateString格式都包含时区的名称 - 它不是。这是一个实现细节。
所以,我现在被卡住了。
答案 0 :(得分:32)
您可以从日期对象的toString()
方法中删除它。 new Date.toString()
会在Firefox,Safari和Chrome中产生类似Wed Sep 19 2012 10:04:32 GMT-0400 (Eastern Daylight Time)
的内容。您想要的数据是 - 括号内的大写字母。所需要的就是刮掉它们。
对于Internet Explorer,toString()
的结果已包含EDT
。
对于Opera,您唯一的选择是满足GMT-0400
或类似。 toString()
方法中没有任何可刮擦的东西。
var now = new Date().toString();
var TZ = now.indexOf('(') > -1 ?
now.match(/\([^\)]+\)/)[0].match(/[A-Z]/g).join('') :
now.match(/[A-Z]{3,4}/)[0];
if (TZ == "GMT" && /(GMT\W*\d{4})/.test(now)) TZ = RegExp.$1;
示例结果:
Firefox:TZ = "EDT"
Safari:TZ = "EDT"
Chrome:TZ = "EDT"
IE:TZ = "EDT"
Opera:TZ = "GMT-0400"
似乎与我所尝试的所有亚洲和欧洲随机时区一样好,返回关岛的WPST(西太平洋标准时间),吉隆坡的MPST(马来半岛标准时间)等;并且平稳地降级为GMT + 0X00表示法,浏览器不提供名称(例如珀斯)。
答案 1 :(得分:7)
见this question。在一般情况下这是不可行的,但是从可能情况的候选名单中选择默认时区,你可以做出不错的猜测。
允许用户在您猜错时覆盖它。
答案 2 :(得分:1)
我要做的是确定标准和日光偏移(这听起来像你已经知道的。如果没有,你可以从Josh Fraser的这个参考http://onlineaspect.com/examples/timezone/detect_timezone.js开始)。一旦知道标准偏差和日光偏移,就可以始终在服务器端确定时区。然后可以使用Ajax调用,以便不需要页面刷新。最终结果是你现在在JavaScript端有时区。
答案 3 :(得分:0)
从this answer开始到另一个问题,我发现IP API也为您提供了时区 - 非常方便:
$.ajax({
url: "http://ip-api.com/json",
type: 'GET',
success: function(json) {
console.log("Timezone: " + json.timezone);
},
error: function(err) {
console.log("Request failed, error= " + err);
}
});
答案 4 :(得分:-4)
如果你只想要偏移,那么这就简单得多了
var curdate = new Date();
var offset = curdate.getTimezoneOffset();