繁体   English   中英

new Date()取决于操作系统吗?

[英]new Date() Operating System Dependent?

好吧,所以我正在使用javascript通过像这样的简单正则表达式返回用户系统时间的简写时区

new RegExp('\\(.*\\)').exec(new Date().toString())[0]; 

这在Mac上使用chrome的情况下效果很好,例如,我按预期得到了(UTC)或(EDT)或(PDT),但是一旦我们也使用chrome进入了Windows,此功能就会浮出水面,

因此Mac上的new Date().toString()返回

2014年4月8日星期二16:07:09 GMT-0400(EDT)

当Windows上的new Date().toString()返回时

2014年4月8日,星期二,格林尼治标准时间-0400(美国东部夏令时间)

这对我来说没有任何意义,为什么这样的事情依赖于操作系统,最近是否由于v8的变化导致了此错误,我的目标是简单返回用户时区的简写属性在Chrome中,但这是我面临的问题,我很困惑为什么,如果有人有解决方案或想法来强制返回简写属性,也许是? 我真的很感激,提前感谢。

我在下面回答了这个问题, https://gist.github.com/austinksmith/10281815

一些东西:

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

    15.9.5.2 Date.prototype.toString()

    该函数返回一个字符串值。 String的内容与实现有关,但是旨在以一种方便易懂的形式表示当前时区中的Date。

  • ESTEDT类的缩写并不代表整个时区。 它们专门表示适用于该特定时刻的时区部分 请记住, new Date()初始化为当前的“现在”。 另请参见时区标签Wiki “时区!=偏移”。

  • 通常,时区缩写不明确。 EST可能表示美国的东部标准时间,也可能表示澳大利亚的东部标准时间。 当然,他们可能会在澳大利亚使用AEST,但是谁能说他们是A而不是美国人的缩写呢? 此外,EST也可能意味着澳大利亚东部夏令时间。 缩写“ CST”甚至更糟,它有5种不同的解释-在澳大利亚有两种解释,在美国有一种,在中国有一种,在古巴有一种,并且都有不同的偏移量。 有关更多示例,请参见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 

    但这是一种非常令人沮丧的格式,因为它只针对美国,而对世界其他地区却很少说。 无论如何, RFC1123中已弃用了“军事”区域AY。 代表UTC的只有“ Z”保留为ISO8601等现代格式。

  • 您已经说了想要什么,但没有说为什么 如果您只是想确定用户的时区,请考虑jsTimeZoneDetect ,它将返回一个IANA时区标识符,例如America/New_York 然后,您可以将其带回服务器。 大多数平台都具有本机支持或使用这些库的库。

您可以使用Date#toISOString获得一致的格式。

这是没有道理的,因为javascript。

但是,您可以通过以下方式获取时区偏移量:

yourDate.getTimezoneOffset();

这将以分钟为单位返回浏览器客户端的偏移量。 参见getTimezoneOffset()

从未尝试过,但是最终您要查找的文本是时区的易于理解的描述。 例如,人们可以合理地期望它会根据语言而改变。 不同的浏览器可能采取了不同的方法。

反对IMO的部分将是GMT-0400。 尽管我认为更好的方法是

new Date().getTimezoneOffset() / -60

我想如果您在所有浏览器上都具有相同的含义很重要,那么您可以自己将其转换为文本(加载所有时区的数组或通过Web服务)。

编辑以回应评论

如果您想以编程方式使用信息,则建议改用偏移量。 如果您想将其呈现给用户,那么我可以选择几个选项:

  1. 使用您最初使用的Regexp,并接受在不同的浏览器/操作系统上它会是稍有不同的文本

  2. 为最流行的浏览器/ OS创建一个从正则表达式返回的值的转换表,并显示该表(用“键”表示上面正则表达式返回的值)。 如果不存在匹配项,则可以显示正则表达式返回的值,也可以回退到每个偏移量的默认转换。

  3. 结合偏移量和某种形式的geoIP查找,以对该区域进行最佳猜测(再次匹配您自己的列表以显示文本),也许再次使用每个偏移量的默认值。

或者,当然,也可以是以上几种的组合。 用例是什么? 为什么人类可读但跨浏览器的文本很重要?

我感谢所有提出的答案,这是我想出的

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上返回的字符串为例

“(美国东部夏令时间)”

并剔除美国,然后剔除所有小写字符,并留下“ EDT”和wala,我拥有该时区的简写属性,这可能无法覆盖所有可能的时区,但我目前唯一关心的是北美时区这应该可以处理90%的用例。

如果有人想使用此代码,请随意https://gist.github.com/austinksmith/10281815我进行了一些更新以支持IE10及更低版本,因为返回的格式不同于IE11,请随时进行更新以添加对其他时区的支持:)

编辑:这已经在IE11-9,FireFox,Chrome,Safari中进行了测试,并且至少在Windows和Mac PC方面可以跨平台工作

它与实现有关,也就是说,与操作系统和浏览器有关,因此如果要获得一致的结果,它就不太可靠。

如果您想以特定的方式一致地解析它,那么最好的选择就是在代码中手动解析它,或者使用像datejs之类的包。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM