Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | /**
 * @satisfies {{[unit in Intl.RelativeTimeFormatUnit]?:number}}
 * @constant
 */
const durationUnitsInMillis = {
  month: 1000 * 60 * 60 * 24 * 365 / 12,
  day: 1000 * 60 * 60 * 24,
  hour: 1000 * 60 * 60,
  minute: 1000 * 60,
  second: 1000,
}
 
/**
 * @param {number} time1 - timestamp 1, in milliseconds since Epoch
 * @param {number} time2 - timestamp 2, in milliseconds since Epoch
 * @returns {Duration} duration between timestamps
 */
export function getDurationBetweenTimestamps (time1, time2) {
  const durationInMillis = Math.abs(time1 - time2)
 
  const totalDays = Math.floor(durationInMillis / durationUnitsInMillis.day)
  const hours = Math.floor((durationInMillis % durationUnitsInMillis.day) / durationUnitsInMillis.hour)
  const minutes = Math.floor((durationInMillis % durationUnitsInMillis.hour) / durationUnitsInMillis.minute)
  const seconds = Math.floor((durationInMillis % durationUnitsInMillis.minute) / durationUnitsInMillis.second)
  const milliseconds = durationInMillis % durationUnitsInMillis.second
 
  if (totalDays === 0) {
    return { hours, minutes, seconds, milliseconds, totalDays, years: 0, months: 0, days: 0 }
  }
 
  const maxTimestamp = Math.max(time1, time2)
  const minTimestamp = Math.min(time1, time2)
  const maxDate = new Date(maxTimestamp)
  const minDate = new Date(minTimestamp)
  const diffYears = maxDate.getFullYear() - minDate.getFullYear()
  const diffMonths = maxDate.getMonth() - minDate.getMonth()
  const diffDays = maxDate.getDate() - minDate.getDate()
  const elapsedDays = diffDays < 0 ? daysInMonth(minDate.getMonth(), minDate.getFullYear()) - diffDays : diffDays
  const elapsedMonths = (diffMonths < 0 ? 12 - diffMonths : diffMonths) - (diffDays < 0 ? 1 : 0)
  const elapsedYears = diffYears - (diffMonths < 0 ? 1 : 0)
 
  return { hours, minutes, seconds, milliseconds, totalDays, years: elapsedYears, months: elapsedMonths, days: elapsedDays }
}
 
/**
 * @param {number} month - month to check, it is zero-based (January is 0)
 * @param {number} year - year to check, used to detect if it is a leap year
 * @returns {number} number of days in a month
 */
function daysInMonth (month, year) {
  return new Date(year, (month + 1) % 12, 0).getDate()
}
 
/**
 * @typedef {object} Duration
 * @property {number} hours - elapsed remaining hours
 * @property {number} minutes - elapsed remaining minutes
 * @property {number} seconds - elapsed remaining seconds
 * @property {number} milliseconds - elapsed remaining milliseconds
 * @property {number} days - elapsed remaining days
 * @property {number} months - elapsed remaining months
 * @property {number} years - elapsed years
 * @property {number} totalDays - elapsed days
 */
  |