intervalToDuration.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { normalizeInterval } from "./_lib/normalizeInterval.js";
  2. import { add } from "./add.js";
  3. import { differenceInDays } from "./differenceInDays.js";
  4. import { differenceInHours } from "./differenceInHours.js";
  5. import { differenceInMinutes } from "./differenceInMinutes.js";
  6. import { differenceInMonths } from "./differenceInMonths.js";
  7. import { differenceInSeconds } from "./differenceInSeconds.js";
  8. import { differenceInYears } from "./differenceInYears.js";
  9. /**
  10. * The {@link intervalToDuration} function options.
  11. */
  12. /**
  13. * @name intervalToDuration
  14. * @category Common Helpers
  15. * @summary Convert interval to duration
  16. *
  17. * @description
  18. * Convert an interval object to a duration object.
  19. *
  20. * @param interval - The interval to convert to duration
  21. * @param options - The context options
  22. *
  23. * @returns The duration object
  24. *
  25. * @example
  26. * // Get the duration between January 15, 1929 and April 4, 1968.
  27. * intervalToDuration({
  28. * start: new Date(1929, 0, 15, 12, 0, 0),
  29. * end: new Date(1968, 3, 4, 19, 5, 0)
  30. * });
  31. * //=> { years: 39, months: 2, days: 20, hours: 7, minutes: 5, seconds: 0 }
  32. */
  33. export function intervalToDuration(interval, options) {
  34. const { start, end } = normalizeInterval(options?.in, interval);
  35. const duration = {};
  36. const years = differenceInYears(end, start);
  37. if (years) duration.years = years;
  38. const remainingMonths = add(start, { years: duration.years });
  39. const months = differenceInMonths(end, remainingMonths);
  40. if (months) duration.months = months;
  41. const remainingDays = add(remainingMonths, { months: duration.months });
  42. const days = differenceInDays(end, remainingDays);
  43. if (days) duration.days = days;
  44. const remainingHours = add(remainingDays, { days: duration.days });
  45. const hours = differenceInHours(end, remainingHours);
  46. if (hours) duration.hours = hours;
  47. const remainingMinutes = add(remainingHours, { hours: duration.hours });
  48. const minutes = differenceInMinutes(end, remainingMinutes);
  49. if (minutes) duration.minutes = minutes;
  50. const remainingSeconds = add(remainingMinutes, { minutes: duration.minutes });
  51. const seconds = differenceInSeconds(end, remainingSeconds);
  52. if (seconds) duration.seconds = seconds;
  53. return duration;
  54. }
  55. // Fallback for modularized imports:
  56. export default intervalToDuration;