Как отформатировать длительность момента, чтобы его можно было читать?

У меня есть массив длительностей ISO 8601, которые я хочу суммировать, а затем отобразить в удобочитаемом формате. Времена выглядят как PT10M33S, PT3H00M00S, PT50H23M15S, Я использовал момент JS, чтобы разобрать их с moment.duration() но когда я складываю их вместе, я не знаю, как превратить их во что-то читаемое.

3 ответа

Решение

Потратив несколько часов, я обнаружил moment-duration-format плагин. Вы бы позвонили .format() на объект длительности и передать строку, которая форматирует его к тому, что вы хотите отобразить. Вот что я в итоге написал:

function formatDuration(duration, format_string) {
  var length;
  if (format_string === "long") {
    format = [
      duration.months() === 1 ? "Month" : "Months",
      duration.days() === 1 ? "Day" : "Days",
      duration.hours() === 1 ? "Hour" : "Hours",
      duration.minutes() === 1 ? "Minute" : "Minutes",
      duration.seconds() === 1 ? "Second" : "Seconds"
    ];
    length = duration.format("M [" + format[0] + "] d [" + format[1] +
    "] h [" + format[2] + "] m [" + format[3] + " and] s [" + format[4] + "]");
  } else if (format_string === "short") {
    length = duration.format("M[m] d[d] h:mm:ss");
  } else {
    length = duration.format(format_string);
  };
  return length;
};

В соответствии с действующим документом https://momentjs.com/docs/ вы можете сделать:

duration.humanize();
// or if the duration is given in other values like seconds:
moment.duration(60, "seconds").humanize(); // a minute

для отображения длительности в произвольном формате:

moment.utc(duration.as('milliseconds')).format('HH:mm:ss');

Как насчет этого:

> var d = moment.duration(125, 's')
undefined
> moment().subtract(d).fromNow().replace(/ ago/, '')
'2 minutes'
Другие вопросы по тегам