“(时区)”某些机器上新Date()的可接受输入,但其他人期望“时区”

时间:2016-06-08 17:38:05

标签: javascript regex date operating-system

我们有一个函数可以像JS一样解析UTC中的日期/时间对,但后来强制它的行为就好像它是在本地时区中指定的那样。下面:

var tz = (new Date()).toString().match(/\((.+)\)$/)[0];
var str = (new Date()).toUTCString();
str = str.replace(/GMT$/,tz);
var output = new Date(str);

正则表达式返回两个结果,对于我的时区,我得到'(Pacific Daylight Time)''Pacific Daylight Time'。对于我们所有的mac和ubuntu计算机,'Pacific Daylight Time'var tz = (new Date()).toString().match(/\((.+)\)$/)[1];都有效。但是,在某些Windows计算机上,无论使用何种浏览器,我们都需要'(Pacific Daylight Time)'var tz = (new Date()).toString().match(/\((.+)\)$/)[0];,或new Date(str)评估为Invalid Date

造成这种情况的原因是什么?这真的是一些奇怪的操作系统差异吗?我们怎么检查这个?

Here's a repl我在那里玩过不同的机器等等。

2 个答案:

答案 0 :(得分:1)

在我看来,你是在复杂的事情,你不能简单地使用:

new Date(Date.now() + (new Date()).getTimezoneOffset() * 60 * 1000);

或者为了更好的兼容性并避免使用多日期对象:

var a = new Date();
a.setTime(a.getTime() + a.getTimezoneOffset() * 60 * 1000);

答案 1 :(得分:1)

  

造成这种情况的原因是什么?

Date.prototype.toString的输出完全依赖于实现。

  

这真的是一些奇怪的操作系统差异吗?

从一开始就是这样,与规范一致(见上文)。

  

我们如何检查?

命名时区没有标准,您也不能依赖于实现一致地命名它们。不同的实现使用不同的名称。

E.g。 Chrome中的 toString 方法报告“E. Australia Standard Time”,IE显示“UTC + 1000”,时区通常称为“澳大利亚东部标准时间”。

Date.prototype.getTimezoneOffset 在几分钟内返回主机的时区偏移量,但与ISO 8601约定符号相反。所以+10:00是-600,-07:00是+420。

根据您对andlrc的回答的评论:

  

但它会像date = 2016-06-12和time = 11:45:00一样进入,其中   然后设置为str为str =(新日期(日期+“T”+   时间))toUTCString();

这是一件特别的事情。没有时区的日期和时间将被视为本地时间,因此将根据当地时区进行调整。然后在GMT时区输出它,因此它将显示不同的日期和时间,具体取决于主机系统的时区设置。

此外,强烈建议使用Date构造函数(或Date.parse)解析字符串,因为它在浏览器中不一致(上面的解析将在IE 8中返回无效日期,某些主机将允许超出范围值和一些惯于)。您应该手动解析日期和时间(库可以提供帮助,但编写特定格式的解析函数非常简单)。