123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- import { defaultLocale } from "./_lib/defaultLocale.js";
- import { getDefaultOptions } from "./_lib/defaultOptions.js";
- /**
- * The {@link formatDuration} function options.
- */
- const defaultFormat = [
- "years",
- "months",
- "weeks",
- "days",
- "hours",
- "minutes",
- "seconds",
- ];
- /**
- * @name formatDuration
- * @category Common Helpers
- * @summary Formats a duration in human-readable format
- *
- * @description
- * Return human-readable duration string i.e. "9 months 2 days"
- *
- * @param duration - The duration to format
- * @param options - An object with options.
- *
- * @returns The formatted date string
- *
- * @example
- * // Format full duration
- * formatDuration({
- * years: 2,
- * months: 9,
- * weeks: 1,
- * days: 7,
- * hours: 5,
- * minutes: 9,
- * seconds: 30
- * })
- * //=> '2 years 9 months 1 week 7 days 5 hours 9 minutes 30 seconds'
- *
- * @example
- * // Format partial duration
- * formatDuration({ months: 9, days: 2 })
- * //=> '9 months 2 days'
- *
- * @example
- * // Customize the format
- * formatDuration(
- * {
- * years: 2,
- * months: 9,
- * weeks: 1,
- * days: 7,
- * hours: 5,
- * minutes: 9,
- * seconds: 30
- * },
- * { format: ['months', 'weeks'] }
- * ) === '9 months 1 week'
- *
- * @example
- * // Customize the zeros presence
- * formatDuration({ years: 0, months: 9 })
- * //=> '9 months'
- * formatDuration({ years: 0, months: 9 }, { zero: true })
- * //=> '0 years 9 months'
- *
- * @example
- * // Customize the delimiter
- * formatDuration({ years: 2, months: 9, weeks: 3 }, { delimiter: ', ' })
- * //=> '2 years, 9 months, 3 weeks'
- */
- export function formatDuration(duration, options) {
- const defaultOptions = getDefaultOptions();
- const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;
- const format = options?.format ?? defaultFormat;
- const zero = options?.zero ?? false;
- const delimiter = options?.delimiter ?? " ";
- if (!locale.formatDistance) {
- return "";
- }
- const result = format
- .reduce((acc, unit) => {
- const token = `x${unit.replace(/(^.)/, (m) => m.toUpperCase())}`;
- const value = duration[unit];
- if (value !== undefined && (zero || duration[unit])) {
- return acc.concat(locale.formatDistance(token, value));
- }
- return acc;
- }, [])
- .join(delimiter);
- return result;
- }
- // Fallback for modularized imports:
- export default formatDuration;
|