【问题标题】:How can I parse this date string consistently across browsers?如何跨浏览器一致地解析此日期字符串?
【发布时间】:2012-07-06 19:15:18
【问题描述】:

我正在使用 Javascript 的 Date 对象将字符串解析为毫秒时间戳。我正在使用 Date.parse(),我正在解析的字符串格式如下:“2012-07-06 12:59:36-0600”

Date.parse 在 Chrome 中表现良好,可以解析为我预期的正确时间戳。但是,当我通过 Date.parse() 运行字符串时,所有其他浏览器都会返回“NaN”。

我知道 Date 对象实现是特定于浏览器的,但我想找到一个能够为任何浏览器解析这种类型的字符串的 javascript 解决方案。关于我可以在 Javascript 中使用什么来实现这一点的任何建议?

【问题讨论】:

  • 将字符串分成几部分,使用对应的Date.prototype.set*方法或者Date构造函数得到一个Date实例。这是一个开始的正则表达式:/(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})([-+]\d{4})/.

标签: javascript cross-browser


【解决方案1】:

将输入转换为有效的ISO 8601

Date.parse("2012-07-06 12:59:36-0600".replace(' ', 'T'));

这已在 Firefox 中测试(并且有效)。

注意:

请注意,虽然在日期字符串中使用了时区说明符 解析以正确解释参数,它们不会影响 返回的值,始终是之间的毫秒数 1970 年 1 月 1 日 00:00:00 UTC 和由 论据。

【讨论】:

【解决方案2】:

你试过DateJS吗?也许您不想添加另一个库,但它会解决您的跨浏览器问题。

【讨论】:

  • DateJS 似乎是一个旧库,但它适用于我这里需要的东西,所以我想我会使用它。知道它是否仍然受到支持?最新版本看起来像是 2007 年的,但我可能错了。
  • 从 Google Code repo 来看,自 2008 年以来我没有看到任何进展。不知道有什么新的可比的。
【解决方案3】:

如果格式一致,可以自己解析:

var date = "2012-07-06 12:59:36-0600";
function parseDatetime(input) {
    var match = input.match(/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})([-+]\d{4})/);
    match.shift(); // discard the "full match" index
    match[2]--;
    match[4] += parseInt(match[6],10);
    return new Date(match[0],match[1],match[2],match[3],match[4],match[5]);
}

【讨论】:

  • 您可能应该在发布之前对此进行测试。返回中的所有索引都应递增 1。
  • 即便如此,我认为它也不能正确处理时区。
  • 糟糕。 -fixes- 如果我在正确的地方使用它(分钟而不是小时),我很确定时区会没问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多