Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 新日期()是否依赖于操作系统?_Javascript_Regex_Timezone - Fatal编程技术网

Javascript 新日期()是否依赖于操作系统?

Javascript 新日期()是否依赖于操作系统?,javascript,regex,timezone,Javascript,Regex,Timezone,好的,我使用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美国东部时间 windows上的ne

好的,我使用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美国东部时间

windows上的new Date.toString返回时

2014年4月8日星期二16:08:11 GMT-0400美国东部夏时制

这对我来说没有任何意义,为什么像这样的东西会依赖于操作系统,是不是v8中的一个变化导致了最近的错误,我的目标是在Chrome中简单地返回用户时区的速记属性,但这是我面临的问题,我很困惑为什么,如果有人有一个解决方案或想法来强制返回速记属性,也许?我会非常感激的,提前谢谢你


我在下面回答了这个问题,

它依赖于实现,这意味着它依赖于操作系统和浏览器,如果您想要一致的结果,那么它就不太可靠


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

这没有意义,因为javascript

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

yourDate.getTimezoneOffset();
这将在几分钟内返回浏览器客户端偏移量。
请参见

从未尝试过,但在一天结束时,您尝试查找的文本是人类可读的时区描述。例如,人们可以合理地预期它会基于语言而改变。完全有可能不同的浏览器采用了不同的方法

国际海事组织(IMO)计划反对的部分将是GMT-0400。虽然我认为更好的方法是

new Date().getTimezoneOffset() / -60
我想您可以自己将其转换为文本,或者加载一个包含所有时区的数组,或者通过一个web服务(如果在所有浏览器上都有相同的时区很重要的话)

根据评论进行编辑

如果你想以编程方式使用这些信息,那么我建议使用偏移量。如果您想向用户展示它,那么在我看来,您有两个选项:

使用您最初拥有的Regexp,并接受它将是一个 不同浏览器/操作系统上的文本略有不同

创建从regexp返回的值的转换表 用于最流行的浏览器/操作系统,并使用 beng上面的regexp返回的值。如果没有对手 存在。您可以显示regexp返回的值,也可以 返回到默认的每偏移平移

将偏移量和某种形式的geoIP查找结合起来,以获得最佳结果 猜测区域是否与文本中您自己的列表再次匹配 若要显示,请再次使用默认的每个偏移量

当然,也可以是上述因素的某种组合。用例是什么?为什么可读但跨浏览器的文本很重要?

以下几点:

是的,JavaScript日期对象上.toString的输出依赖于实现。您将在不同的操作系统、浏览器和版本上获得不同的结果。其定义如下:

15.9.5.2日期.prototype.toString

此函数返回一个字符串值。字符串的内容取决于实现,但旨在以方便的、人类可读的形式表示当前时区中的日期

EST和EDT等缩写词并不代表整个时区。它们具体表示适用于特定时间点的时区段。请记住,新日期现在已初始化为当前日期。另请参见时区!=抵消

一般来说,时区缩写是模棱两可的。EST在美国可能意味着东部标准时间,在澳大利亚可能意味着东部标准时间。当然,他们在澳大利亚可能会使用AEST,但谁能说他们是准备A而不是美国人的人呢?此外,EST也可能意味着澳大利亚东部夏季时间。缩写CST更糟糕,有5种不同的解释——两种在澳大利亚,一种在美国,一种在中国,一种在古巴,并且都有不同的偏移量。有关更多示例,请参见

规范中定义的时区缩写的唯一标准是§5.1:

但这是一种非常令人沮丧的格式,因为它只关注美国,很少涉及世界其他地区。无论如何,A-Y军事区都遭到了反对。只有Z表示UTC仍然采用现代格式,如

你说了你想要的,但不是你想要它的原因。如果您只是尝试确定用户的时区,请考虑哪些将返回IANA时区标识符。 ,例如美国/纽约。然后,您可以将其带回服务器。大多数平台都有本机支持或库来处理这些问题


您可以使用来获得一致的格式。

我很感谢大家给出的所有答案,以下是我的想法

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%的用例

如果有人想使用此代码,请随意。我做了一些更新以支持IE10及更低版本,因为返回的格式不同于IE11,请随意更新以添加对其他时区的支持:


编辑:这已经在IE11-9、FireFox、Chrome、Safari和works跨平台上进行了测试,至少在Windows和Mac PC上是这样的

如果您想要一致的格式,请使用new Date.toISOString。这将在所有操作系统中提供相同的输出。不幸的是,IE依赖于区域设置,而区域设置不一定是标准化的,特别是对于这样的事情。您可以使用.getTimezoneOffset API获取数字时区偏移量,然后通过您喜欢的任何映射进行转换。java!==javascriptI我知道java不是javascript,我的意思是,如果V8中发生了更改,那么所有这些字符串都可以使用吗?唯一的Date.now对我很有用…选择作为最佳答案,提供了一种简单的方法来计算偏移量,然后可以匹配到时区的速记版本,希望这是跨操作系统的标准化,尤其是在同一浏览器中,但我们不能赢得所有的,可以吗,谢谢。取消选择作为最佳答案,使用偏移量不是确定用户时区的可靠方法,因为多个时区共享相同的偏移量不确定不使用库的解决方案是什么,但完全基于偏移量的解决方案似乎也不可靠。@user3512616您需要时区的确切目的是什么?偏移量是否不足。@AnthonyGrist如我在评论中所解释的,偏移量不适用,因为多个时区共享相同的偏移量,尝试根据偏移量值以编程方式检查要使用的时区将是有问题的,并且不是完全可行的解决方案,我在回答中提供了我能想到的最佳解决方案,看看我采取的方法,它涵盖了所有北美时区,不依赖偏移量进行匹配。我接受并怀疑@AnthonyGrist也这样认为,仅偏移量不足以确定时区。问题是为什么需要时区而不是偏移量?
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+")";
}