2010-05-24 70 views
20

我需要确定JS中的客户端时区(例如CET,GMT,EST)。获得偏移量很简单,但没有确定TZ所需的全部信息,至少不容易。我有一种感觉,可能可能使用偏移的组合,无论DST是否正在使用和有效,等等,但我希望别人已经完成了这项工作,特别是考虑到奇怪的例外时间处理。在JS中获取客户端时区(不是GMT偏移量)

This question是类似的,但问题和答案都基于(不正确)的假设,每个浏览器的DateString格式都包含时区的名称 - 它没有。这是一个实现细节。

所以,我目前卡住了。

回答

7

请参阅this question。在一般情况下这是不可行的,但是从可能的情况下选择一个默认时区,你可以做出一个合适的猜测。

允许用户覆盖它,因为当你猜错了。

+0

的确,这只是需要提供体面的猜测。如果它可以为90%的用户正确预填,我会非常高兴。 – 2010-05-24 17:45:38

+0

嗨,有了这个,我们将获得如Aisa/kabul那样的时区,然后如何将它转换为'AFT'(缩写形式)? – Jeevi 2012-05-02 12:11:57

+0

@Tool:不幸的是,我没有公开地提供region-> timezone-name的查询,所以你必须自己做。 (实际上,甚至没有全球公认的时区缩写。)请记住,没有一对一的映射:例如,如果你得到该地区,你将不得不决定是否使用'GMT'或'BST'时区,具体取决于你希望表达的年份中的哪一部分。 – bobince 2012-05-03 16:29:38

1

我会做的是确定标准和日光偏移量(这听起来像你已经知道的,如果没有,你可以从Josh Fraser的这个参考文献http://onlineaspect.com/examples/timezone/detect_timezone.js开始)。一旦标准和日光偏移已知,确定时区总是可以在服务器端完成。然后可以使用Ajax调用,以便不需要刷新页面。最终结果是你现在在JavaScript端有时区。

+0

提供的链接说找不到。 – Ikrom 2014-02-14 05:43:11

+0

这是更正的链接,我猜:http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/ – Dichev 2015-09-12 23:00:22

-4

如果你只是想要偏移量,那么这就简单多了

var curdate = new Date();

var offset = curdate.getTimezoneOffset();

+1

OP是寻找缩写的时区名称。 – Gary 2012-09-24 15:59:25

+0

OP _specifically said_这不是什么想要的。看到标题:“__not GMT抵消金额_” – Nateowami 2015-04-07 08:32:28

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; 

实施例的结果:

  • 火狐:TZ = "EDT"

  • Safari中:TZ = "EDT"

  • 铬:TZ = "EDT"

  • IE:TZ = "EDT"

  • 歌剧:TZ = "GMT-0400"

似乎所有的随机亚洲和欧洲时区我试图和工作一样好,吉隆坡返回关岛(西太平洋标准时间),MPST WPST (马来半岛标准时间)等;并且在浏览器不提供该名称的情况下和平地退化为GMT + 0X00表示法(例如,珀斯)。

+0

太棒了。确切地说,很多人都在寻找我想象的 – Yablargo 2013-06-13 02:37:43

+1

感谢你 - 我们正在使用它。但它并不适用于世界各地。例如,它在沙特阿拉伯引发了一个错误。 *不能调用null *的方法'join'。现在我用try/catch包装它,并将TZ设置为'我的当地时间'作为快速修复。我相信有一个更好的修复方法可以完成,但这个很快:) – tom 2014-03-14 18:50:41

+0

p.s.我认为问题是Date.toString()没有使用罗马字母返回值,所以正则表达式不匹配 – tom 2014-03-14 19:06:42

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); 
    } 
}); 
相关问题