| 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; | |
| } | |