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

时间:2014-12-03 11:04:47

标签: java javascript

我需要使用JavaScript或Java将ISO-8601持续时间转换为日期。 例如,像P0000-00-60T00:00:00这样的ISO-8601和像2014-11-30这样的当前日期意味着,我想得到像2015-01-29

这样的输出

1 个答案:

答案 0 :(得分:2)

在ECMAScript中,解析ISO 8601日期,如" 2014-11-30"很直接。执行此操作的功能还应验证日期并返回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);