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

Adr*_*ian 7 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));
}
Run Code Online (Sandbox Code Playgroud)

链接自己查看: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 
Run Code Online (Sandbox Code Playgroud)

Firefox 26.0在控制台中返回以下内容:

"Tuesday, January 21, 2014"
"Invalid Date"
"Tuesday, January 21, 2014"
"Monday, January 20, 2014"
Run Code Online (Sandbox Code Playgroud)

即使Internet Explorer 8也能正常运行,在控制台中返回以下内容:

"Tuesday, January 21, 2014"
"Tuesday, January 21, 2014"
"Tuesday, January 21, 2014"
"NaN"
Run Code Online (Sandbox Code Playgroud)

简而言之,我知道浏览器之间的日期处理是不一致的(Chrome和Firefox中的日期[2]不同,日期[3]在IE 8中完全中断),但这不是我的问题.

我的问题是:

为什么Chrome和Firefox会返回YYYY-MM-DD格式日期字符串的昨天日期,指定今天的日期,当它与斜杠一起正常工作时?

另一个问题:

这是一个已知的问题?

我之前没有遇到它,也找不到任何问题的文档,也没有找到Date()对象的文档,这些文档会向我表明这种字符串转换会经常发生 - 不规则.有没有人有这方面的经验,也许是一个我没有找到的解释或链接?我可以在这里使用错误的搜索词......

Poi*_*nty 5

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 格式输入日期,这意味着当我输入 `new Date("2014-01-23")` 我'实际上是在输入`new Date("2014-01-23T00:00:00")`,它被转换为我的计算机时区(GMT-0600),从而使我实际上指的是昨天的日期。GMT 中的“2014-01-23T00:00:00”相当于 CST (GMT-0600) 中的“2014-01-22T18:00:00”。因为我输入的日期字符串没有指定时区,所以它假定为格林威治标准时间。谢谢! (4认同)