Add date difference calculator
This commit is contained in:
parent
4b320ff7cf
commit
5b56273ffa
53
date-diff.ts
Normal file
53
date-diff.ts
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
// https://stackoverflow.com/a/49201872
|
||||||
|
const calcDateDifference = (
|
||||||
|
start: string | Date,
|
||||||
|
end: string | Date
|
||||||
|
): { year: number; month: number; day: number } => {
|
||||||
|
// Convert to true dates without time
|
||||||
|
let startDate = new Date(new Date(start).toISOString().substring(0, 10));
|
||||||
|
let endDate = new Date(
|
||||||
|
(end ? new Date(end) : new Date()).toISOString().substring(0, 10)
|
||||||
|
);
|
||||||
|
|
||||||
|
// If start date comes after end, flip them around
|
||||||
|
if (startDate > endDate) {
|
||||||
|
const swap = startDate;
|
||||||
|
startDate = endDate;
|
||||||
|
endDate = swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Account for leap years
|
||||||
|
const startYear = startDate.getFullYear();
|
||||||
|
const february =
|
||||||
|
(startYear % 4 === 0 && startYear % 100 !== 0) || startYear % 400 === 0
|
||||||
|
? 29
|
||||||
|
: 28;
|
||||||
|
const daysInMonth = [31, february, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
||||||
|
|
||||||
|
// Create year and month diffs
|
||||||
|
let yearDiff = endDate.getFullYear() - startYear;
|
||||||
|
let monthDiff = endDate.getMonth() - startDate.getMonth();
|
||||||
|
if (monthDiff < 0) {
|
||||||
|
yearDiff--;
|
||||||
|
monthDiff += 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create day diff while adjusting others
|
||||||
|
let dayDiff = endDate.getDate() - startDate.getDate();
|
||||||
|
if (dayDiff < 0) {
|
||||||
|
if (monthDiff > 0) {
|
||||||
|
monthDiff--;
|
||||||
|
} else {
|
||||||
|
yearDiff--;
|
||||||
|
monthDiff = 11;
|
||||||
|
}
|
||||||
|
dayDiff += daysInMonth[startDate.getMonth()];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return true differentials
|
||||||
|
return {
|
||||||
|
year: yearDiff,
|
||||||
|
month: monthDiff,
|
||||||
|
day: dayDiff,
|
||||||
|
};
|
||||||
|
}
|
Reference in New Issue
Block a user