用破折号分隔并以年份开头时出现Javascript Date.parse错误

Javascript Date.parse bug when dash-delimited and starts with year

本文关键字:Javascript Date 错误 parse 开头 分隔 破折号      更新时间:2023-09-26

我正在寻求确认这是否是Javascript的Date.parse方法的真正文档和/或实现错误。

我所指的医生在https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/parse他们说:"如果你没有指定时区,就假设是本地时区。">

但下面的代码显示,尽管没有指定时区,但如果传递给Date.parse的字符串以4位数的年份表示形式开始,并以短划线分隔,则本地时间是而不是(而是应用了我的时区偏移量(。

var euroStyleDate = '2011-10-04';
var amerStyleDate = '10/04/2011';
var euroStyleParsed = Date.parse(euroStyleDate);
var amerStyleParsed = Date.parse(amerStyleDate);
console.log(euroStyleParsed); //1317686400000
console.log(amerStyleParsed); //1317700800000
console.log(new Date(euroStyleParsed)); 
//Date {Mon Oct 03 2011 20:00:00 GMT-0400 (Eastern Daylight Time)}
console.log(new Date(amerStyleParsed)); 
//Date {Tue Oct 04 2011 00:00:00 GMT-0400 (Eastern Daylight Time)}

甚至可能还有其他情况,如果我不正确的话,我相信我不是第一个发现这一点的人。因此,毫无疑问,如果有人知道相关链接,我当然希望能得到更深入的信息。

我在FF3、Chrome for Windows中遇到了这种情况,当然,作为一个特殊的IE8似乎甚至无法在2011-10-04上执行转换:我只是在我的应用程序中得到了一个空字符串

提前感谢您提供任何进一步的见解或资源。

我也遇到了这个概念。对于任何像我一样在谷歌上搜索"Javascript日期短划线-斜杠"的人来说,这是我能想到的关于这里发生的事情的最清晰的演示。

简而言之,斜线表示本地时区,短划线表示UTC。其他答案也解释了原因。

<script type="text/javascript">
var 
testB = new Date("2012/02/09"),
testC = new Date("2012-02-09");

alert(testB.toString());
alert(testC.toString());
alert(testC.toUTCString());
</script>

**更新:**这里似乎有几个不同的标准在起作用:

  1. EMCAScript<5标准中允许用于标准IETF格式中的日期,例如Sun Oct 03 2010。根据这些日期,假定为当地时区。

  2. 在ECMAScript 5中,也允许ISO 8601标准的有限版本,例如2010-10-03。规范似乎在说(也许遵循ISO 8601?(在这种情况下,如果没有指定UTC时区,则假定为UTC时区。

  3. 我还没有找到一个说明Date.parse可以处理mm/dd/yyyy日期的规范,但我的浏览器(Chrome 14(显然可以,可能其他浏览器也可以。这似乎遵循了上面的标准1,假设是本地时区。然而,考虑到它不在规范中,我建议不要使用这个版本,因为它可能取决于浏览器(如果我在浏览器上设置了欧洲语言环境,我不知道10-03-2010是否会导致不同的日期(。

在大多数解释器中,本机Date.parse函数存在一些问题——我经常遇到像您描述的那样的时区问题。所以一般来说,我要么使用像Datejs这样的库,要么编写自己的解析函数。SIMILEAJAX库的DateTime模块有一个很好的示例函数,用于解析ISO-8601日期(您所说的euroStyleDate,加上一个可选的时间组件(。

在设置日期时,我通常使用new Date(),然后使用setUTC*()函数将不同的日期元素设置为我想要的精度。这并不完美,但至少你正在处理一个清晰的时区。