Javascript新的Date函数中的奇怪行为

我试图在 JavaScript中使用字符串中的Date对象,但是我在这里看到javascript解析日期字符串非常奇怪.
> new Date("2012-01-01");
Sun Jan 01 2012 07:00:00 GMT+0700 (ICT)

> new Date("01-01-2012");
Sun Jan 01 2012 00:00:00 GMT+0700 (ICT)

> new Date("2012-01-01") == new Date("01-01-2012")
false

我使用Chrome 32,因为你可以看到他们是7小时不同.请告诉我这里发生了什么?

解决方法

这是关于浏览器如何实现Date.parse( spec).该方法在传递给Date构造函数( spec)的字符串中被调用,并首先尝试将字符串与已知格式匹配,以确定哪些值在哪里.我希望不同的浏览器以稍微不同的方式实现该决策树,但是Chrome的实现可能假定“2012-01-01”版本是基于Zulu或GMT / UTC的 ISO-8601标准的前缀,并且包括时区(“2012-01-01T00:00:00Z-07:00”),而“01-01-2012”版本是根据您的LOCAL时区进行本地化,并不打算指定(“01 -01-2012 00:00:00“),所以7小时的差异基于ISO标准日期和本地化日期之间的7小时偏差.相反,Date.prototype.toString()( spec)应该显示本地时间,并由Date构造函数返回,这就是为什么它本地化在您的测试的两个返回值中.

spec for Date.parse:

The function first attempts to parse the format of the String according to the rules called out in Date Time String Format (07005). If the String does not conform to that format the function may fall back to any implementation-specific heuristics or implementation-specific date formats. Unrecognizable Strings or dates containing illegal element values in the format String shall cause Date.parse to return NaN.

含义如果您不使用15.9.1.15中指定的完整的ISO-8601日期,浏览器可以使其完成,或者只是给您NaN.即使这是标准,一些浏览器是不知道实际上不遵循标准,所以您可以考虑通过自己解析数据并使用另一个Date构造函数(spec)来明确地指定所有参数.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...