在Java / JavaScript中解析ISO-8601持续时间



我需要使用 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);

最新更新