新的Date()操作系统依赖?

时间:2014-04-08 20:10:22

标签: javascript regex timezone

好吧所以我使用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

5 个答案:

答案 0 :(得分:1)

一些事情:

  • 是的,JavaScript .toString()对象上Date的输出取决于实现。您将在不同的操作系统,浏览器和版本上获得不同的结果。这由ECMAScript 5.1 §15.9.5.2定义如下:

      

    15.9.5.2 Date.prototype.toString()

         

    此函数返回String值。 String的内容依赖于实现,但旨在以方便的,人类可读的形式表示当前时区中的Date。

  • ESTEDT等缩写词并不代表整个时区。它们专门表示适用于该特定时刻的时区的。请记住,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

我想你可以自己将它翻译成文本(加载所有时区的数组或通过网络服务),如果在所有浏览器上都一样重要。

编辑以回应评论

如果您想以编程方式使用该信息,那么我建议使用偏移量。如果您想将它呈现给用户,那么您可以看到以下几个选项:

  1. 使用您原来的Regexp并接受它将是一个 不同浏览器/操作系统上略有不同的文字

  2. 创建从正则表达式返回的值的转换表 对于最流行的浏览器/操作系统并提供(使用“密钥”) beng你的正则表达式返回的值)。如果没有匹配 存在,您可以呈现正则表达式返回的值或 回归到每个偏移的默认翻译。

  3. 将偏移量和某种形式的geoIP查找结合起来以获得最佳效果 猜测区域(再次匹配您自己的文本列表 (可能会再次使用默认的每个偏移量。)

  4. 或者,当然,上面的一些组合。用例是什么?为什么人类可读但跨浏览的文本很重要?

答案 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或类似的包。