JavaScript新日期(dateStr)昨天发布';以特定格式显示日期

JavaScript新日期(dateStr)昨天发布';以特定格式显示日期,javascript,date,Javascript,Date,tl;dr-当我尝试使用YYYY-MM-DD格式的日期字符串创建新的日期对象时,它给出了错误的日期(昨天)。为什么? 我编写了以下测试代码来帮助我演示我所感知到的问题: var dateConfig = {weekday: "long", year: "numeric", month: "long", day: "numeric"}, dates = [ "01/21/2014", "01-21-2014", "2014/01/21",

tl;dr-当我尝试使用YYYY-MM-DD格式的日期字符串创建新的日期对象时,它给出了错误的日期(昨天)。为什么?

我编写了以下测试代码来帮助我演示我所感知到的问题:

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));
}
Firefox
26.0
在控制台中返回以下内容:

Tuesday, January 21, 2014
Tuesday, January 21, 2014
Tuesday, January 21, 2014
Monday, January 20, 2014 
"Tuesday, January 21, 2014"
"Invalid Date"
"Tuesday, January 21, 2014"
"Monday, January 20, 2014"
"Tuesday, January 21, 2014"
"Tuesday, January 21, 2014"
"Tuesday, January 21, 2014"
"NaN"
即使是Internet Explorer 8也能正确完成大部分操作,并在控制台中返回以下内容:

Tuesday, January 21, 2014
Tuesday, January 21, 2014
Tuesday, January 21, 2014
Monday, January 20, 2014 
"Tuesday, January 21, 2014"
"Invalid Date"
"Tuesday, January 21, 2014"
"Monday, January 20, 2014"
"Tuesday, January 21, 2014"
"Tuesday, January 21, 2014"
"Tuesday, January 21, 2014"
"NaN"
简而言之,我知道浏览器之间的日期处理是不一致的(Chrome和Firefox中的日期[2]不同,IE 8中的日期[3]完全不同),但这不是我的问题

我的问题是:

为什么Chrome和Firefox会返回昨天的YYYY-MM-DD日期 指定今天日期的格式化日期字符串,该字符串可用于 砍

另一个问题:

这是一个已知的问题吗


我以前没有遇到过这个问题,也找不到关于这个问题的任何文档,也找不到Date()对象的文档,这会向我表明这样的字符串转换会经常发生。有没有人有这方面的经验,或者是我没有找到的解释或链接?我可能只是在这里使用了错误的搜索词…

JavaScript标准规定“官方”支持的格式是ISO 8601,看起来像
YYYY-MM-DDTHH:MM:ss.sssZ
。(Z是指定为“Z”(UTC)或“+”或“-”的时区偏移量,后跟一个时间表达式
HH:mm
),尽管格式中确实包含时区偏移量,但Firefox和Chrome(我认为IE)并不在意,总是将ISO 8601日期解释为UTC


任何实现也可以接受其他格式,而且浏览器目前不同步。Firefox将接受RFC 2822日期,其他浏览器不接受。

感谢ISO/RFC编号。他们促使我进行了更多的研究,这让我认识到,这是假设我输入的日期是扩展的ISO-8601格式,也就是说,当我输入新日期(“2014-01-23”)时,我实际上输入的是新日期(“2014-01-23T00:00”),它被转换为我的计算机时区(GMT-0600),因此,我实际上是指昨天的日期2014-01-23T00:00:00相当于CST(GMT-0600)中的代码>2014-01-22T18:00:00。因为没有为我输入的日期字符串指定时区,所以它假定为GMT。谢谢@阿德里安:是的,完全正确!我本应该加上那个信息的,但当我回答这个问题时我很匆忙:)@Adrian-我想你假设得太多了。;-)截至ed 5.1(2011)的ECMA-262规定,“2014-01-23”应被视为UTC(与ISO 8601相反),我认为所有专业至少现在都这样做了。但是,2014-01-01T00:00:00应视为本地(Safari将其视为UTC除外)。不要使用内置解析器,它会给您带来麻烦。其他相关主题: