Javascript新日期函数中的奇怪行为
我试图在javascript中从字符串生成日期对象,但我发现javascript在这里解析日期字符串非常奇怪Javascript新日期函数中的奇怪行为,javascript,Javascript,我试图在javascript中从字符串生成日期对象,但我发现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") f
> 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
我使用的是Chrome32,正如你所看到的那样,它们相差7小时。请告诉我这里发生了什么?这是关于浏览器如何实现日期解析的。对传递到
Date
构造函数()中的字符串调用该方法,并首先尝试将字符串与已知格式匹配,以确定哪些值在哪里。我希望不同的浏览器以略微不同的方式实现该决策树,但Chrome的实现可能假设“2012-01-01”
版本是基于Zulu或GMT/UTC的标准的前缀,并且包含时区(“2012-01-01T00:00:00Z-07:00”
),而“01-01-2012”
版本是基于本地时区的本地化版本,不需要费心指定(“01-01-2012 00:00:00”
),因此7小时的差异基于ISO标准日期和本地化日期之间的7小时偏移量<相反,code>Date.prototype.toString()()应该显示本地时间,并由Date
构造函数返回,这就是为什么它在测试的两个返回值中都本地化了
从forDate.parse中:
函数首先尝试根据日期时间字符串格式()中调用的规则解析字符串的格式。如果字符串不符合该格式,函数可能会退回到任何特定于实现的启发式或特定于实现的日期格式。无法识别的字符串或格式字符串中包含非法元素值的日期将导致Date.parse返回NaN。
这意味着,如果您没有使用中指定的完整ISO-8601日期,浏览器可以在进行时补足,或者只给您NaN
。尽管这是标准,但有些浏览器因为没有真正遵循标准而臭名昭著,所以你可以考虑仅仅通过解析数据本身和使用其他<代码>日期<代码>构造函数()/< P> > P>来明确地指定所有的参数。避免该问题的一个好方法是自己解析字符串。如果希望将2012-01-01视为UTC,则:
function dateFromUTCString(s) {
var s = s.split(/\D/);
return new Date(Date.UTC(s[0], --s[1], s[2]));
}
如果要将其视为本地日期,则:
function dateFromString(s) {
var s = s.split(/\D/);
return new Date(s[0], --s[1], s[2]);
}
那个这是该死的。奇怪的就像第一个返回本地时间,第二个UTC。除了在这两种情况下都加上GMT偏移量。@remus在这两种情况下都返回本地时间,因为toString就是这样做的。第一个被解析为UTC,第二个被解析为本地时间。您依赖于日期构造函数解析字符串,这是已知的由使用中的浏览器不一致地实现的。您可以使用,但并非所有浏览器都支持它。最好手动解析字符串并自己构建日期对象。回答得很好!我在Node.js中也看到了同样的现象。看起来最好的做法是指定日期结构或始终默认为YYYY-MM-DD。这是标准做法,并且具有可按字符串“字母顺序”排序和按日期顺序结束的附加优势。如果这对您很重要…@citizensave,但并非所有使用中的浏览器都支持“标准”,因此建议手动解析,至少目前是这样。