index.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. const toZeroIfInfinity = value => Number.isFinite(value) ? value : 0;
  2. function parseNumber(milliseconds) {
  3. return {
  4. days: Math.trunc(milliseconds / 86_400_000),
  5. hours: Math.trunc(milliseconds / 3_600_000 % 24),
  6. minutes: Math.trunc(milliseconds / 60_000 % 60),
  7. seconds: Math.trunc(milliseconds / 1000 % 60),
  8. milliseconds: Math.trunc(milliseconds % 1000),
  9. microseconds: Math.trunc(toZeroIfInfinity(milliseconds * 1000) % 1000),
  10. nanoseconds: Math.trunc(toZeroIfInfinity(milliseconds * 1e6) % 1000),
  11. };
  12. }
  13. function parseBigint(milliseconds) {
  14. return {
  15. days: milliseconds / 86_400_000n,
  16. hours: milliseconds / 3_600_000n % 24n,
  17. minutes: milliseconds / 60_000n % 60n,
  18. seconds: milliseconds / 1000n % 60n,
  19. milliseconds: milliseconds % 1000n,
  20. microseconds: 0n,
  21. nanoseconds: 0n,
  22. };
  23. }
  24. export default function parseMilliseconds(milliseconds) {
  25. switch (typeof milliseconds) {
  26. case 'number': {
  27. if (Number.isFinite(milliseconds)) {
  28. return parseNumber(milliseconds);
  29. }
  30. break;
  31. }
  32. case 'bigint': {
  33. return parseBigint(milliseconds);
  34. }
  35. // No default
  36. }
  37. throw new TypeError('Expected a finite number or bigint');
  38. }