pretty_time.js 1.81 KB
Newer Older
1 2
import _ from 'underscore';

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/*
 * TODO: Make these methods more configurable (e.g. stringifyTime condensed or
 * non-condensed, abbreviateTimelengths)
 * */

/*
 * Accepts seconds and returns a timeObject { weeks: #, days: #, hours: #, minutes: # }
 * Seconds can be negative or positive, zero or non-zero. Can be configured for any day
 * or week length.
*/

export function parseSeconds(seconds, { daysPerWeek = 5, hoursPerDay = 8 } = {}) {
  const DAYS_PER_WEEK = daysPerWeek;
  const HOURS_PER_DAY = hoursPerDay;
  const MINUTES_PER_HOUR = 60;
  const MINUTES_PER_WEEK = DAYS_PER_WEEK * HOURS_PER_DAY * MINUTES_PER_HOUR;
  const MINUTES_PER_DAY = HOURS_PER_DAY * MINUTES_PER_HOUR;

  const timePeriodConstraints = {
    weeks: MINUTES_PER_WEEK,
    days: MINUTES_PER_DAY,
    hours: MINUTES_PER_HOUR,
    minutes: 1,
  };
27

28
  let unorderedMinutes = Math.abs(seconds / MINUTES_PER_HOUR);
29

30 31
  return _.mapObject(timePeriodConstraints, (minutesPerPeriod) => {
    const periodCount = Math.floor(unorderedMinutes / minutesPerPeriod);
32

33
    unorderedMinutes -= (periodCount * minutesPerPeriod);
34

35 36 37
    return periodCount;
  });
}
38

39 40 41 42
/*
* Accepts a timeObject (see parseSeconds) and returns a condensed string representation of it
* (e.g. '1w 2d 3h 1m' or '1h 30m'). Zero value units are not included.
*/
43

44 45 46 47 48 49 50
export function stringifyTime(timeObject) {
  const reducedTime = _.reduce(timeObject, (memo, unitValue, unitName) => {
    const isNonZero = !!unitValue;
    return isNonZero ? `${memo} ${unitValue}${unitName.charAt(0)}` : memo;
  }, '').trim();
  return reducedTime.length ? reducedTime : '0m';
}
51

52 53 54 55
/*
* Accepts a time string of any size (e.g. '1w 2d 3h 5m' or '1w 2d') and returns
*  the first non-zero unit/value pair.
*/
56

57 58 59 60
export function abbreviateTime(timeStr) {
  return timeStr.split(' ')
    .filter(unitStr => unitStr.charAt(0) !== '0')[0];
}
61