UNPKG

temporal-extra

Version:

Locale-aware date utilities for Temporal: week numbers, date adjusters, polyfill support and more

28 lines (27 loc) 1.27 kB
import "./week-info/polyfill.js"; const getFirstWeekStart = (year, weekInfo) => { const yearDate = Temporal.PlainDate.from({ year: year, month: 1, day: 1 }); const dayOfYearStart = yearDate.dayOfWeek; const offset = (7 + dayOfYearStart - weekInfo.firstDay) % 7; if (7 - offset >= weekInfo.minimalDays) { return yearDate.subtract({ days: offset }); } return yearDate.add({ days: 7 - offset }); }; /** * Calculates locale-aware week number. */ export const localeAwareWeekNumber = (date, locale) => { const weekInfo = (typeof locale === "string" ? new Intl.Locale(locale) : locale).getWeekInfo(); const thisYearFirstWeekStart = getFirstWeekStart(date.year, weekInfo); if (Temporal.PlainDate.compare(date, thisYearFirstWeekStart) < 0) { const prevYearFirstWeekStart = getFirstWeekStart(date.year - 1, weekInfo); return prevYearFirstWeekStart.until(thisYearFirstWeekStart, { largestUnit: "weeks" }).weeks; } const nextYearFirstWeekStart = getFirstWeekStart(date.year + 1, weekInfo); if (Temporal.PlainDate.compare(date, nextYearFirstWeekStart) >= 0) { return 1; } const diff = thisYearFirstWeekStart.until(date, { largestUnit: "weeks" }).weeks; return Math.floor(diff) + 1; };