temporal-extra
Version:
Locale-aware date utilities for Temporal: week numbers, date adjusters, polyfill support and more
28 lines (27 loc) • 1.27 kB
JavaScript
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;
};