我试图在
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)来明确地指定所有参数.