tl; dr - 当我尝试使用YYYY-MM-DD格式的日期字符串创建一个新的Date对象时,它会给我一个不正确的日期(昨天)。为什么呢?
我写了以下测试代码来帮助我演示我所感知的问题:
var dateConfig = {weekday: "long", year: "numeric", month: "long", day: "numeric"},
dates = [
"01/21/2014",
"01-21-2014",
"2014/01/21",
"2014-01-21"
];
for (var i = 0; i < dates.length; ++ i) {
var date = new Date(dates[i]);
console.log(date.toLocaleDateString("en-US", dateConfig));
}
链接自己查看:http://s.codepen.io/AdrianTP/fullpage/prKyf
Chrome 31.0.1650.63 m
会在控制台中返回以下内容:
Tuesday, January 21, 2014
Tuesday, January 21, 2014
Tuesday, January 21, 2014
Monday, January 20, 2014
Firefox 26.0
在控制台中返回以下内容:
"Tuesday, January 21, 2014"
"Invalid Date"
"Tuesday, January 21, 2014"
"Monday, January 20, 2014"
即使Internet Explorer 8大部分都正确,在控制台中返回以下内容:
"Tuesday, January 21, 2014"
"Tuesday, January 21, 2014"
"Tuesday, January 21, 2014"
"NaN"
简而言之,我知道浏览器之间的日期处理是不一致的(Chrome和Firefox中的日期[2]不同,日期[3]在IE 8中完全中断),但这不是我的问题。
我的问题是:
为什么Chrome和Firefox会在昨天返回YYYY-MM-DD的日期 格式化日期字符串指定今天的日期,当它正常工作 斜线?
另一个问题:
这是一个已知问题吗?
我之前没有遇到过,也找不到任何问题的文档,也没有找到Date()对象的文档,这些文档会向我表明这种字符串转换会经常发生 - 不规则。有没有人有这方面的经验,也许是一个我没有找到的解释或链接?我可以在这里使用错误的搜索条件......
答案 0 :(得分:4)
JavaScript标准规定“官方”支持的格式为ISO 8601,类似于YYYY-MM-DDTHH:mm:ss.sssZ
。 (Z是指定为“Z”(对于UTC)或“+”或“ - ”后跟时间表达式HH:mm
的时区偏移。)虽然格式包含时区偏移,但Firefox和Chrome (我认为 IE)不注意,并始终将ISO 8601日期解释为UTC。
任何实现也可以接受其他格式,目前浏览器不同步。 Firefox将接受RFC 2822日期,其他浏览器则不接受。