UNPKG

datezone

Version:

A lightweight and comprehensive date and timeZone utility library for JavaScript.

149 lines 6.1 kB
import { calendarToTimestamp, timestampToCalendar } from "./calendar.pub.js"; import { dayOfWeekBase } from "./day.pub.js"; export var WeekStartsOn; (function (WeekStartsOn) { WeekStartsOn[WeekStartsOn["SUNDAY"] = 0] = "SUNDAY"; WeekStartsOn[WeekStartsOn["MONDAY"] = 1] = "MONDAY"; WeekStartsOn[WeekStartsOn["SATURDAY"] = 6] = "SATURDAY"; })(WeekStartsOn || (WeekStartsOn = {})); export function week(timestamp, timeZone) { const dt = timestampToCalendar(timestamp, timeZone); return weekBase(dt.year, dt.month, dt.day); } export function weekBase(year, month, day) { const d = new Date(Date.UTC(year, month - 1, day)); const dayOfWeek = d.getUTCDay() || 7; d.setUTCDate(d.getUTCDate() + 4 - dayOfWeek); const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7); } export function getISOWeekYear(timestamp, timeZone) { const dt = timestampToCalendar(timestamp, timeZone); return getISOWeekYearBase(dt.year, dt.month, dt.day); } export function getISOWeekYearBase(year, month, day) { const d = new Date(Date.UTC(year, month - 1, day)); const dayOfWeek = d.getUTCDay() || 7; d.setUTCDate(d.getUTCDate() + 4 - dayOfWeek); return d.getUTCFullYear(); } export function startOfWeek(timestamp, timeZone, weekStartsOn = WeekStartsOn.MONDAY) { if (!timeZone) { const d = new Date(timestamp); const day = d.getDay(); const diff = (day - weekStartsOn + 7) % 7; d.setDate(d.getDate() - diff); d.setHours(0, 0, 0, 0); return d.getTime(); } const dt = timestampToCalendar(timestamp, timeZone); return startOfWeekBase(dt.year, dt.month, dt.day, weekStartsOn, timeZone); } /** * Start of week base. * * @param year - The year. * @param month - The month (1-12). * @param day - The day (1-31). * @param weekStartsOn - The day of the week to start the week on. * @param timeZone - The timezone. * @returns The timestamp for the start of the week. * @see https://datezone.dev/docs/reference/week#startofweekbase */ export function startOfWeekBase(year, month, day, weekStartsOn, timeZone) { const dayNum = dayOfWeekBase(year, month, day); const jsDay = dayNum === 7 ? 0 : dayNum; const daysFromWeekStart = (jsDay - weekStartsOn + 7) % 7; return calendarToTimestamp(year, month, day - daysFromWeekStart, 0, 0, 0, 0, timeZone); } export function endOfWeek(timestamp, timeZone, weekStartsOn = WeekStartsOn.MONDAY) { if (!timeZone) { const d = new Date(timestamp); const day = d.getDay(); const diff = (day - weekStartsOn + 7) % 7; d.setDate(d.getDate() - diff + 6); d.setHours(23, 59, 59, 999); return d.getTime(); } const dt = timestampToCalendar(timestamp, timeZone); return endOfWeekBase(dt.year, dt.month, dt.day, weekStartsOn, timeZone); } /** * End of week base. * * @param year - The year. * @param month - The month (1-12). * @param day - The day (1-31). * @param weekStartsOn - The day of the week to start the week on. * @param timeZone - The timezone. * @returns The timestamp for the end of the week. * @see https://datezone.dev/docs/reference/week#endofweekbase */ export function endOfWeekBase(year, month, day, weekStartsOn, timeZone) { const dayNum = dayOfWeekBase(year, month, day); const jsDay = dayNum === 7 ? 0 : dayNum; const weekEnd = (weekStartsOn + 6) % 7; const daysToWeekEnd = (weekEnd - jsDay + 7) % 7; return calendarToTimestamp(year, month, day + daysToWeekEnd, 23, 59, 59, 999, timeZone); } export function addWeeks(timestamp, amount, timeZone) { const weeksInMs = amount * 604800000; // 7 * 24 * 60 * 60 * 1000 if (!timeZone) { return timestamp + weeksInMs; } const dt = timestampToCalendar(timestamp, timeZone); return addWeeksBase(dt.year, dt.month, dt.day, amount, timeZone); } /** * Add weeks base. * * @param year - The year. * @param month - The month (1-12). * @param day - The day (1-31). * @param amount - The number of weeks to add. * @param timeZone: - The timezone. * @returns The timestamp for the given date plus the given number of weeks. * @see https://datezone.dev/docs/reference/week#addweeksbase */ export function addWeeksBase(year, month, day, amount, timeZone) { return calendarToTimestamp(year, month, day + amount * 7, 0, 0, 0, 0, timeZone); } export function subWeeks(timestamp, amount, timeZone) { return addWeeks(timestamp, -amount, timeZone); } export function startOfISOWeek(timestamp, timeZone) { return startOfWeek(timestamp, timeZone, WeekStartsOn.MONDAY); } export function endOfISOWeek(timestamp, timeZone) { return endOfWeek(timestamp, timeZone, WeekStartsOn.MONDAY); } export function weeksInMonth(timestamp, timeZone, weekStartsOn = WeekStartsOn.MONDAY) { const dt = timestampToCalendar(timestamp, timeZone); return weeksInMonthBase(dt.year, dt.month, weekStartsOn, timeZone); } /** * Weeks in month base. * * @param year - The year. * @param month - The month (1-12). * @param weekStartsOn - The day of the week to start the week on. * @param tz - The timezone. * @returns The number of weeks in the month. * @see https://datezone.dev/docs/reference/week#weeksinmonthbase */ export function weeksInMonthBase(year, month, weekStartsOn, timeZone) { if (!timeZone) { const firstDayOfWeek = new Date(year, month - 1, 1).getDay(); const daysInMonth = new Date(year, month, 0).getDate(); const daysFromWeekStart = (firstDayOfWeek - weekStartsOn + 7) % 7; const totalDays = daysFromWeekStart + daysInMonth; return Math.ceil(totalDays / 7); } const firstDayOfWeek = dayOfWeekBase(year, month, 1); const jsDay = firstDayOfWeek === 7 ? 0 : firstDayOfWeek; const daysInMonth = new Date(year, month, 0).getDate(); const daysFromWeekStart = (jsDay - weekStartsOn + 7) % 7; const totalDays = daysFromWeekStart + daysInMonth; return Math.ceil(totalDays / 7); } //# sourceMappingURL=week.pub.js.map