在 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>
我有一个从 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>