Проверьте нулевую продолжительность с помощью моментов - PullRequest
0 голосов
/ 12 декабря 2018

Я реализовал функцию, которая получает строку ISO 8601 продолжительности и вычисляет последовательность для дня.

Функция зависает для недопустимых строк продолжительности.Эти строки интерпретируются как нулевая длительность, и поэтому функция создает бесконечную последовательность ["00:00","00:00",...].

timeSeq("PT12H")
// ["00:00", "12:00"]

timeSeq(undefined)
// hangs ....

Нулевая длительность отображается на P0D через duration.toISOString().Как мне проверить нулевую продолжительность в моей функции?

const timeSeq = (durationString, format = "HH:mm") => {
  const duration = moment.duration(durationString);
  // function should return [] for zero duration
  // ???
  const current = moment().startOf("day");
  const end = current.clone().add(1, "day").startOf("day");
  const sequence = [];
  while (current < end) {
    sequence.push(current.format(format));
    current.add(duration);
  }
  return sequence;
};

1 Ответ

0 голосов
/ 12 декабря 2018

Вы можете получить значение длительности, используя функцию as, вы можете использовать asMilliseconds() или as('milliseconds') (или аналогичные методы получения).

Более того, выМожно проверить, является ли объект длительностью, используя moment.isDuration(obj).

Вы можете использовать somenthing так:

function isZeroDuration(dur){
  if( !moment.isDuration(dur) ){
    return true;
  }
  return dur.as('milliseconds') === 0;
}

[null, undefined, 'P0D', 'hello', 'P1D'].forEach((durationString) => {
  const duration = moment.duration(durationString);
  console.log(durationString, isZeroDuration(duration) );
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
...