File size: 1,549 Bytes
cf86710 | 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 | import {
differenceInDays,
type GetWeekOptions,
getWeek as getWeekFns,
} from "date-fns";
import { toEthiopicDate, toGregorianDate } from "../utils/index.js";
import { startOfWeek } from "./startOfWeek.js";
/**
* Get week number for Ethiopian calendar
*
* @param {Date} date - The original date
* @param {GetWeekOptions} [options] - The options object
* @returns {number} The week number
*/
export function getWeek(date: Date, options?: GetWeekOptions): number {
const weekStartsOn = options?.weekStartsOn ?? 1; // Default to Monday (1)
const etDate = toEthiopicDate(date);
const currentWeekStart = startOfWeek(date, { weekStartsOn });
// Get the first day of the current year
const firstDayOfYear = toGregorianDate({
year: etDate.year,
month: 1,
day: 1,
});
const firstWeekStart = startOfWeek(firstDayOfYear, { weekStartsOn });
// If date is before the first week of its year
if (date < firstWeekStart) {
return getWeekFns(date, { weekStartsOn, firstWeekContainsDate: 1 });
}
// If date falls into the first week of the NEXT Ethiopic year, return 1
const nextYearFirstDay = toGregorianDate({
year: etDate.year + 1,
month: 1,
day: 1,
});
const nextYearFirstWeekStart = startOfWeek(nextYearFirstDay, {
weekStartsOn,
});
if (date >= nextYearFirstWeekStart) {
return 1;
}
// Calculate week number based on days since first week
const daysSinceFirstWeek = differenceInDays(currentWeekStart, firstWeekStart);
return Math.floor(daysSinceFirstWeek / 7) + 1;
}
|