Javascript Date.parse以破折号分隔的bug并以年份开头

时间:2011-10-05 16:23:47

标签: javascript date

如果这是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执行转换:我只是在获取一个空字符串我的申请

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

2 个答案:

答案 0 :(得分:14)

我也遇到了这个概念。对于像我一样谷歌搜索“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 :(得分:9)

* 更新: *看起来这里有几种不同的标准:

  1. EMCAScript&lt;允许standard IETF format中的日期的5个标准,例如Sun Oct 03 2010。使用这些日期,假定为当地时区。

  2. 在ECMAScript 5中,还允许使用limited version of the ISO 8601 standard,例如2010-10-03。该规范似乎说(可能遵循ISO 8601?),在这种情况下,如果没有指定一个时区,则假定为UTC时区。

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

  4. 大多数解释器中的本地Date.parse函数存在一些问题 - 我经常遇到与您描述的问题类似的时区问题。所以一般来说,我要么使用像Datejs这样的库,要么我自己编写解析函数。 DateTime module of the SIMILE AJAX library具有非常好的示例函数,用于解析ISO-8601日期(您所指的是euroStyleDate,以及可选的时间组件)。

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