我需要使用 JavaScript 或 Java 将 ISO-8601 持续时间转换为日期。例如,ISO-8601 像 P0000-00-60T00:00:00
和当前日期像 2014-11-30
意味着,我想得到像2015-01-29
在 ECMAScript 中,解析像 "2014-11-30" 这样的 ISO 8601 日期很简单。执行此操作的函数还应该验证日期,如果日期无效,则返回 NaN:
function parseYMD(s) {
var b = s.split(/D/);
var d = new Date(b[0], --b[1], b[2]);
return d && d.getFullYear() == b[0] && d.getDate() == b[2]? d : NaN;
}
您可以应用类似的逻辑来解析周期并将其添加到日期:
// Period in extended format: Py-m-dTh:m:s
// Modifies the date passed in and returns it
function addPeriod(p, d) {
d = d || new Date();
var b = p.match(/d+/g);
d.setFullYear(d.getFullYear() + +(b[0]), d.getMonth() + +(b[1]), d.getDate() + +(b[2]));
d.setHours(d.getHours() + +(b[3]), d.getMinutes() + +(b[4]), d.getMinutes() + +(b[5]))
return d;
}
以上还应验证周期的各个部分不超过其模数,例如月不能超过 12,小时不能超过 24,分钟不能超过 59,等等。
// Parse string to date
var date = parseYMD('2014-11-21');
console.log(date);
// Add a period to a date
addPeriod('P1-0-0T10:10:10', date);
console.log(date);