【问题标题】:JavaScript new Date(dateStr) Giving Yesterday's Date in Certain Formats [duplicate]JavaScript new Date(dateStr)以某些格式给出昨天的日期[重复]
【发布时间】:2014-02-11 10:00:27
【问题描述】:

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() 对象的文档,这表明这种字符串转换会如此定期地发生。有没有人有这方面的经验,也许是我没有找到的解释或链接?我可能只是在这里使用了错误的搜索词...

【问题讨论】:

标签: javascript date


【解决方案1】:

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。因为我输入的日期字符串没有指定时区,所以它假定为 GMT。谢谢!
  • @Adrian 是的,完全正确!我应该添加该信息,但当我回答时我很着急:)
  • @Adrian——我认为你假设太多了。 ;-) ECMA-262 从 ed 5.1 (2011) 开始说“2014-01-23”应该被视为 UTC(与 ISO 8601 相反),我认为所有专业至少现在都这样做了。但是, 2014-01-01T00:00:00 应被视为本地(Safari 将其视为 UTC 除外)。只是不要使用内置的解析器,它会给你带来麻烦。
猜你喜欢
  • 2012-07-10
  • 1970-01-01
  • 2016-08-26
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多