JavaScript新日期(dateStr)以某些格式给出昨天的日期

时间:2014-01-21 16:56:50

标签: javascript date

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()对象的文档,这些文档会向我表明这种字符串转换会经常发生 - 不规则。有没有人有这方面的经验,也许是一个我没有找到的解释或链接?我可以在这里使用错误的搜索条件......

1 个答案:

答案 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日期,其他浏览器则不接受。