react-day-picker
Version:
Customizable Date Picker for React
48 lines (41 loc) • 1.29 kB
text/typescript
import type { Locale } from 'date-fns';
import addDays from 'date-fns/addDays';
import differenceInCalendarDays from 'date-fns/differenceInCalendarDays';
import endOfWeek from 'date-fns/endOfWeek';
import getWeek from 'date-fns/getWeek';
import startOfWeek from 'date-fns/startOfWeek';
import { MonthWeek } from './getMonthWeeks';
/** Return the weeks between two dates. */
export function daysToMonthWeeks(
fromDate: Date,
toDate: Date,
options?: {
locale?: Locale;
weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
firstWeekContainsDate?: 1 | 2 | 3 | 4 | 5 | 6 | 7;
}
): MonthWeek[] {
const toWeek = endOfWeek(toDate, options);
const fromWeek = startOfWeek(fromDate, options);
const nOfDays = differenceInCalendarDays(toWeek, fromWeek);
const days: Date[] = [];
for (let i = 0; i <= nOfDays; i++) {
days.push(addDays(fromWeek, i));
}
const weeksInMonth = days.reduce((result: MonthWeek[], date) => {
const weekNumber = getWeek(date, options);
const existingWeek = result.find(
(value) => value.weekNumber === weekNumber
);
if (existingWeek) {
existingWeek.dates.push(date);
return result;
}
result.push({
weekNumber,
dates: [date]
});
return result;
}, []);
return weeksInMonth;
}