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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | 8x 8x 8x 8x 8x 8x 8x 8x 2x 8x 3x 3x 8x 4x 4x 8x 5x 5x 8x 6x 6x 8x 7x 7x 8x 8x 8x 8x | import { compareAsc, differenceInDays, differenceInHours, differenceInMilliseconds, differenceInMinutes, differenceInMonths, differenceInSeconds, differenceInYears, isValid, sub, } from 'date-fns' import { anyToDate } from './anyToDate' export type IntervalToRestrictiveDurationTarget = | 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond' export interface IntervalToRestrictiveDurationResult { years: number months: number days: number hours: number minutes: number seconds: number milliseconds: number } // ref: https://github.com/date-fns/date-fns/blob/master/src/intervalToDuration/index.js export function intervalToRestrictiveDuration( start: string | number | Date, end: string | number | Date, target: IntervalToRestrictiveDurationTarget = 'year', ): IntervalToRestrictiveDurationResult { const dateLeft = anyToDate(start) const dateRight = anyToDate(end) Iif (!isValid(dateLeft)) { throw new RangeError('Start Date is invalid') } Iif (!isValid(dateRight)) { throw new RangeError('End Date is invalid') } const duration: IntervalToRestrictiveDurationResult = { years: 0, months: 0, days: 0, hours: 0, minutes: 0, seconds: 0, milliseconds: 0, } let remaining: Date = dateLeft const sign = compareAsc(dateLeft, dateRight) if (target === 'year') { duration.years = Math.abs(differenceInYears(remaining, dateRight)) } if (target === 'year' || target === 'month') { remaining = sub(remaining, { years: sign * duration.years }) duration.months = Math.abs(differenceInMonths(remaining, dateRight)) } if (target === 'year' || target === 'month' || target === 'day') { remaining = sub(remaining, { months: sign * duration.months }) duration.days = Math.abs(differenceInDays(remaining, dateRight)) } if ( target === 'year' || target === 'month' || target === 'day' || target === 'hour' ) { remaining = sub(remaining, { days: sign * duration.days }) duration.hours = Math.abs(differenceInHours(remaining, dateRight)) } if ( target === 'year' || target === 'month' || target === 'day' || target === 'hour' || target === 'minute' ) { remaining = sub(remaining, { hours: sign * duration.hours }) duration.minutes = Math.abs(differenceInMinutes(remaining, dateRight)) } if ( target === 'year' || target === 'month' || target === 'day' || target === 'hour' || target === 'minute' || target === 'second' ) { remaining = sub(remaining, { minutes: sign * duration.minutes }) duration.seconds = Math.abs(differenceInSeconds(remaining, dateRight)) } if ( target === 'year' || target === 'month' || target === 'day' || target === 'hour' || target === 'minute' || target === 'second' || target === 'millisecond' ) { remaining = sub(remaining, { seconds: sign * duration.seconds }) duration.milliseconds = Math.abs( differenceInMilliseconds(remaining, dateRight), ) } return duration } |