【问题标题】:Date.getTime() returns NaN for ISO/Twitter API dates in IE11Date.getTime() 为 IE11 中的 ISO/Twitter API 日期返回 NaN
【发布时间】:2015-04-05 06:06:13
【问题描述】:

这是my code

var date = "2014-07-23T15:23:12+0000";
var ts = new Date(date).getTime();
console.log(ts);

为什么 IE11 打印 NaN

Firefox/Chrome/等浏览器打印1406128992000没有问题。

【问题讨论】:

  • 我猜日期字符串是无效的,来自invalid date的getTime是NaN
  • Safari 也返回 NaN
  • 你的问题就在这里2014-07-23T15:23:12+0000
  • 我无法控制这些数据。它来自社交 api/json。我该怎么办?
  • 您应该以某种方式解析日期,并将数字传递给 Date 构造函数。

标签: javascript internet-explorer date timestamp


【解决方案1】:

引自 ECMAScript 语言规范,Date Time String Format 部分:

ECMAScript 定义了基于日期时间的字符串交换格式 根据 ISO 8601 扩展格式的简化。格式是 如下:YYYY-MM-DDTHH:mm:ss.sssZ
...
Z 是指定为“Z”(对于 UTC)或“+”或“-”后跟时间表达式 HH:mm

的时区偏移量

显然,您需要在时区指示符中添加:。这应该在 IE9 中工作:

var dateString = "2014-07-23T15:23:12+0000";
var dateStringISO = dateString.replace(/([+\-]\d\d)(\d\d)$/, "$1:$2");
var timestamp = new Date(dateStringISO).getTime();
console.log(dateString, dateStringISO, timestamp);

对于 Twitter 日期,您可以使用相同的策略:

var dateString = "Mon Jan 13 16:04:04 +0000 2014";
var dateStringISO = dateString.replace(/^... (...) (..) (........) (...)(..) (....)$/, function(match, month, date, time, tz1, tz2, year) {
  return year + "-" + {
    Jan: "01",
    Feb: "02",
    Mar: "03",
    Apr: "04",
    May: "05",
    Jun: "06",
    Jul: "07",
    Aug: "08",
    Sep: "09",
    Oct: "10",
    Nov: "11",
    Dec: "12"
  }[month] + "-" + date + "T" + time + tz1 + ":" + tz2;
});
var timestamp = new Date(dateStringISO).getTime();
console.log(dateString, dateStringISO, timestamp);

【讨论】:

  • 但是如果每个日期都失败?还带有日期,例如“Mon Jan 13 16:04:04 +0000 2014”返回 NaN。
  • 它在规范中说 如果字符串不符合该格式,则函数可能会退回到任何特定于实现的启发式或特定于实现的日期格式。 所以是的, 特定的日期格式可能在一种浏览器中有效,但在另一种浏览器中无效。
  • 这是他们 json 结果中的 Twitter 格式标准。我将如何解析Mon Jan 13 16:04:04 +0000 2014
  • 使用正则表达式替换将其更改为Mon, 13 Jan 2014 16:04:04 GMT;根据MDN,这种格式应该可以工作。
  • 我不太擅长正则表达式。你能帮帮我吗?
猜你喜欢
  • 2014-07-01
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多