在 javascript 中解析 ISO 8601 基本日期时间格式

Parse ISO 8601 basic datetime format in javascript

我有一个从 JSON 返回的日期,格式如下:

YYYYMMDDThhmmssZ

我想在 Javascript 中解析它。我发现一些资源将此格式归类为 ISO-8601 basic 格式,它与 extended 格式略有不同,如下所示:

YYYY-MM-DDThh:mm:ssZ

我找到了一些关于如何解析扩展格式的资源,但到目前为止我还没有找到任何关于解析基本格式的资源。 Javascript 的 Date 模块中是否存在这样的功能,或者我必须使用其他模块(例如 Moment)?我问是因为这对我来说不是一个真正的选择,因为我正在开发的应用程序是一个 gnome-shell 扩展,我不想有任何额外的依赖关系。

更新

如果您不能使用 moment.js 并且您可以依赖所描述的输入格式,那么请考虑使用如下内容自行解析:

function parseDate(input) {
  return new Date(Date.UTC(
    parseInt(input.slice(0, 4), 10),
    parseInt(input.slice(4, 6), 10) - 1,
    parseInt(input.slice(6, 8), 10),
    parseInt(input.slice(9, 11), 10),
    parseInt(input.slice(11, 13), 10),
    parseInt(input.slice(13,15), 10)
  ));
}

console.log(parseDate('20130208T080910Z'));

切出复合部分相当简单。唯一的怪癖是一月是第 0 个月(因此 - 1)并且 Date 构造函数假定您的参数是当地时间,因此我们遵循 Date 文档中给出的建议:

Note: Where Date is called as a constructor with more than one argument, the specifed arguments represent local time. If UTC is desired, use new Date(Date.UTC(...)) with the same arguments.

我省略了格式检查,但如果你需要它,你可以定义一个正则表达式来检查你的输入(我建议不要比 /^[0-9]{8}T[0-9]{6}Z$/ 更复杂,然后让 Date.UTC(...) 做它的事)。

旧答案,已更新以明确指定格式字符串

如果可以使用moment.js,已经支持解析这种格式:

console.log(moment('20130208T080910Z', 'YYYYMMDDTHHmmssZ'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment-with-locales.min.js"></script>