好吧所以我使用javascript来返回用户系统时间的简写时区,使用简单的正则表达式
new RegExp('\\(.*\\)').exec(new Date().toString())[0];
这在Mac下使用chrome工作得很好,例如我得到(UTC)或(EDT)或(PDT),但是一旦我们使用chrome转到窗口,这个功能就落到了它的脸上,
所以mac上的new Date().toString()
返回
Tue Apr 08 2014 16:07:09 GMT-0400(EDT)
而Windows上的new Date().toString()
返回
Tue Apr 08 2014 16:08:11 GMT-0400(US Eastern Daylight Time)
这对我来说没有任何意义,为什么这样的东西会依赖于操作系统,最近导致这个bug的v8有变化,我的目标是简单地简单回归一下Chrome中的用户时区,但这是我面临的问题,我很困惑为什么,如果有人有解决方案或者想要强制简写属性可能会被退回?我非常感谢,提前谢谢。
我在下面回答了这个问题,https://gist.github.com/austinksmith/10281815
答案 0 :(得分:1)
一些事情:
是的,JavaScript .toString()
对象上Date
的输出取决于实现。您将在不同的操作系统,浏览器和版本上获得不同的结果。这由ECMAScript 5.1 §15.9.5.2定义如下:
15.9.5.2 Date.prototype.toString()
此函数返回String值。 String的内容依赖于实现,但旨在以方便的,人类可读的形式表示当前时区中的Date。
EST
和EDT
等缩写词并不代表整个时区。它们专门表示适用于该特定时刻的时区的段。请记住,new Date()
已初始化为当前“现在”。另请参阅the timezone tag wiki中的“时区!=偏移”。
通常,时区缩写不明确。 EST可能意味着美国的东部标准时间,或者它可能意味着澳大利亚的东部标准时间。当然,他们可能在澳大利亚使用AEST,但是谁说他们是先于A而不是美国人?此外,EST也可能意味着澳大利亚东部夏天时间。缩写“CST”更糟糕,有5种不同的解释 - 两种在澳大利亚,一种在美国,一种在中国,一种在古巴,并且都有不同的偏差。有关更多示例,请参阅this list on Wikipedia。
规范中甚至定义的时区缩写的唯一标准是RFC822§5.1中的那些:
zone = "UT" / "GMT" ; Universal Time
; North American : UT
/ "EST" / "EDT" ; Eastern: - 5/ - 4
/ "CST" / "CDT" ; Central: - 6/ - 5
/ "MST" / "MDT" ; Mountain: - 7/ - 6
/ "PST" / "PDT" ; Pacific: - 8/ - 7
但这是一种非常沮丧的格式,因为它只关注美国而且对世界其他地方的说法很少。无论如何,“军事”区域A-Y在RFC1123被弃用。只有“Z”代表UTC仍然采用现代格式,如ISO8601。
你说过你想要的东西,但不是为什么你想要它。如果您只是想确定用户的时区,请考虑jsTimeZoneDetect,它会返回IANA时区标识符,例如America/New_York
。然后,您可以将其恢复到您的服务器。大多数平台都有本机支持或用于处理这些平台的库。
答案 1 :(得分:0)
没有意义,因为javascript。
但是,您可以通过这种方式获得时区偏移:
yourDate.getTimezoneOffset();
这将以分钟为单位返回浏览器客户端偏移量。 见getTimezoneOffset()
答案 2 :(得分:0)
从未尝试过,但是你想要找到的文字在一天结束时是一个人类可读的时区描述。例如,人们可以合理地期望它基于语言而改变。不同的浏览器完全有可能采用不同的方法。
IMO计划的部分将是GMT-0400。虽然在我看来更好的方法是
new Date().getTimezoneOffset() / -60
我想你可以自己将它翻译成文本(加载所有时区的数组或通过网络服务),如果在所有浏览器上都一样重要。
编辑以回应评论
如果您想以编程方式使用该信息,那么我建议使用偏移量。如果您想将它呈现给用户,那么您可以看到以下几个选项:
使用您原来的Regexp并接受它将是一个 不同浏览器/操作系统上略有不同的文字
创建从正则表达式返回的值的转换表 对于最流行的浏览器/操作系统并提供(使用“密钥”) beng你的正则表达式返回的值)。如果没有匹配 存在,您可以呈现正则表达式返回的值或 回归到每个偏移的默认翻译。
将偏移量和某种形式的geoIP查找结合起来以获得最佳效果 猜测区域(再次匹配您自己的文本列表 (可能会再次使用默认的每个偏移量。)
或者,当然,上面的一些组合。用例是什么?为什么人类可读但跨浏览的文本很重要?
答案 3 :(得分:0)
我感谢所有提出的答案,这就是我提出的问题
getUserTz: function() {
var tz;
try {
tz = new RegExp('\\(.*\\)').exec(new Date().toString())[0];
} catch(e) { // IE10 and lower support
tz = new Date().toString();
tz = tz.replace(/[^A-Z]/g, '');
var zones = ['ADT','AKDT','AKST','AST','CDT','EDT','EGST','EGT','EST','HADT','HAST','MDT','MST','NDT','PDT','PMDT','PMST','PST','WGST','WGT'];
for(var i=0; i < zones.length; i++) {
if(tz.indexOf(zones[i]) != -1) {
tz = "(" + tz.substr(tz.indexOf(zones[i]), tz.length) + ")";
}
}
}
if(tz && tz.length <= 6) {
return tz;
}
tz = tz.replace("US","");
tz = tz.replace(/[^A-Z]/g, '');
return "("+tz+")";
}
首先尝试我正在使用的原始方法,这样我就可以在mac上获得(EDT),然后如果返回的字符数大于6,我将获取在Windows上返回的字符串,例如
“(美国东部夏令时)”
并删除US,然后我删除所有小写字符,留下我的“EDT”和wala,我有这个时区的速记属性,这可能不包括所有可能的区域,但我现在唯一关注的是北美时区,这应该处理90%的用例。
如果有人想使用此代码,请随意https://gist.github.com/austinksmith/10281815我做了一些更新以支持IE10并降低,因为返回的格式与IE11不同,随时更新以添加对其他时区的支持:)
编辑:这已经在IE11-9,FireFox,Chrome,Safari中进行了测试,并且至少在Windows和Linux上可以跨平台工作。 Mac PC的
答案 4 :(得分:-1)
它依赖于实现,这意味着它依赖于操作系统和浏览器,如果你想要一致的结果,它就不太可靠。
如果您想以特定的方式一致地解析它,最好的办法是在代码中手动解析它或使用datejs或类似的包。