github.com/zoomfoo/nomad@v0.8.5-0.20180907175415-f28fd3a1a056/ui/app/utils/format-duration.js (about)

     1  import moment from 'moment';
     2  
     3  const allUnits = [
     4    { name: 'years', suffix: 'year', inMoment: true, pluralizable: true },
     5    { name: 'months', suffix: 'month', inMoment: true, pluralizable: true },
     6    { name: 'days', suffix: 'day', inMoment: true, pluralizable: true },
     7    { name: 'hours', suffix: 'h', inMoment: true, pluralizable: false },
     8    { name: 'minutes', suffix: 'm', inMoment: true, pluralizable: false },
     9    { name: 'seconds', suffix: 's', inMoment: true, pluralizable: false },
    10    { name: 'milliseconds', suffix: 'ms', inMoment: true, pluralizable: false },
    11    { name: 'microseconds', suffix: 'µs', inMoment: false, pluralizable: false },
    12    { name: 'nanoseconds', suffix: 'ns', inMoment: false, pluralizable: false },
    13  ];
    14  
    15  export default function formatDuration(duration = 0, units = 'ns') {
    16    const durationParts = {};
    17  
    18    // Moment only handles up to millisecond precision.
    19    // Microseconds and nanoseconds need to be handled first,
    20    // then Moment can take over for all larger units.
    21    if (units === 'ns') {
    22      durationParts.nanoseconds = duration % 1000;
    23      durationParts.microseconds = Math.floor((duration % 1000000) / 1000);
    24      duration = Math.floor(duration / 1000000);
    25    } else if (units === 'mms') {
    26      durationParts.microseconds = duration % 1000;
    27      duration = Math.floor(duration / 1000);
    28    }
    29  
    30    let momentUnits = units;
    31    if (units === 'ns' || units === 'mms') {
    32      momentUnits = 'ms';
    33    }
    34    const momentDuration = moment.duration(duration, momentUnits);
    35  
    36    // Get the count of each time unit that Moment handles
    37    allUnits
    38      .filterBy('inMoment')
    39      .mapBy('name')
    40      .forEach(unit => {
    41        durationParts[unit] = momentDuration[unit]();
    42      });
    43  
    44    // Format each time time bucket as a string
    45    // e.g., { years: 5, seconds: 30 } -> [ '5 years', '30s' ]
    46    const displayParts = allUnits.reduce((parts, unitType) => {
    47      if (durationParts[unitType.name]) {
    48        const count = durationParts[unitType.name];
    49        const suffix =
    50          count === 1 || !unitType.pluralizable ? unitType.suffix : unitType.suffix.pluralize();
    51        parts.push(`${count}${unitType.pluralizable ? ' ' : ''}${suffix}`);
    52      }
    53      return parts;
    54    }, []);
    55  
    56    if (displayParts.length) {
    57      return displayParts.join(' ');
    58    }
    59  
    60    // When the duration is 0, show 0 in terms of `units`
    61    const unitTypeForUnits = allUnits.findBy('suffix', units);
    62    const suffix = unitTypeForUnits.pluralizable ? units.pluralize() : units;
    63    return `0${unitTypeForUnits.pluralizable ? ' ' : ''}${suffix}`;
    64  }