我需要确定JS中的客户端时区(例如CET,GMT,EST)。获得偏移量很简单,但没有确定TZ所需的全部信息,至少不容易。我有一种感觉,可能可能使用偏移的组合,无论DST是否正在使用和有效,等等,但我希望别人已经完成了这项工作,特别是考虑到奇怪的例外时间处理。在JS中获取客户端时区(不是GMT偏移量)
This question是类似的,但问题和答案都基于(不正确)的假设,每个浏览器的DateString格式都包含时区的名称 - 它没有。这是一个实现细节。
所以,我目前卡住了。
我需要确定JS中的客户端时区(例如CET,GMT,EST)。获得偏移量很简单,但没有确定TZ所需的全部信息,至少不容易。我有一种感觉,可能可能使用偏移的组合,无论DST是否正在使用和有效,等等,但我希望别人已经完成了这项工作,特别是考虑到奇怪的例外时间处理。在JS中获取客户端时区(不是GMT偏移量)
This question是类似的,但问题和答案都基于(不正确)的假设,每个浏览器的DateString格式都包含时区的名称 - 它没有。这是一个实现细节。
所以,我目前卡住了。
请参阅this question。在一般情况下这是不可行的,但是从可能的情况下选择一个默认时区,你可以做出一个合适的猜测。
允许用户覆盖它,因为当你猜错了。
我会做的是确定标准和日光偏移量(这听起来像你已经知道的,如果没有,你可以从Josh Fraser的这个参考文献http://onlineaspect.com/examples/timezone/detect_timezone.js开始)。一旦标准和日光偏移已知,确定时区总是可以在服务器端完成。然后可以使用Ajax调用,以便不需要刷新页面。最终结果是你现在在JavaScript端有时区。
您可以从日期对象的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;
实施例的结果:
火狐:TZ = "EDT"
Safari中:TZ = "EDT"
铬:TZ = "EDT"
IE:TZ = "EDT"
歌剧:TZ = "GMT-0400"
似乎所有的随机亚洲和欧洲时区我试图和工作一样好,吉隆坡返回关岛(西太平洋标准时间),MPST WPST (马来半岛标准时间)等;并且在浏览器不提供该名称的情况下和平地退化为GMT + 0X00表示法(例如,珀斯)。
从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);
}
});
的确,这只是需要提供体面的猜测。如果它可以为90%的用户正确预填,我会非常高兴。 – 2010-05-24 17:45:38
嗨,有了这个,我们将获得如Aisa/kabul那样的时区,然后如何将它转换为'AFT'(缩写形式)? – Jeevi 2012-05-02 12:11:57
@Tool:不幸的是,我没有公开地提供region-> timezone-name的查询,所以你必须自己做。 (实际上,甚至没有全球公认的时区缩写。)请记住,没有一对一的映射:例如,如果你得到该地区,你将不得不决定是否使用'GMT'或'BST'时区,具体取决于你希望表达的年份中的哪一部分。 – bobince 2012-05-03 16:29:38