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,2014 Monday,January 20,2014
Firefox 26.0在控制台中返回以下内容:
"Tuesday,2014" "Invalid Date" "Tuesday,2014" "Monday,2014"
即使Internet Explorer 8也能正常运行,在控制台中返回以下内容:
"Tuesday,2014" "Tuesday,2014" "NaN"
简而言之,我知道浏览器之间的日期处理是不一致的(Chrome和Firefox中的日期[2]不同,日期[3]在IE 8中完全中断),但这不是我的问题.
我的问题是:
Why would Chrome and Firefox return yesterday’s date for a YYYY-MM-DD
formatted date string specifying today’s date,when it works fine with
slashes?
另一个问题:
Is this a known issue?
我之前没有遇到它,也找不到任何问题的文档,也没有找到Date()对象的文档,这些文档会向我表明这种字符串转换会经常发生 – 不规则.有没有人有这方面的经验,也许是一个我没有找到的解释或链接?我可以在这里使用错误的搜索词……
解决方法
JavaScript标准规定“官方”支持的格式是ISO 8601,看起来像YYYY-MM-DDTHH:mm:ss.sssZ. (Z是指定为“Z”(对于UTC)或“”或“ – ”后跟时间表达式HH:mm的时区偏移.)虽然格式包含时区偏移,但Firefox和Chrome(和我)认为IE)不注意,并始终将ISO 8601日期解释为UTC.
任何实现也可以接受其他格式,并且浏览器目前不同步. Firefox将接受RFC 2822日期,其他浏览器则不接受.