managarten/apps/calendar/packages/shared/src/utils/date.ts
Wuesteon ea3582d487 💄 style: apply prettier formatting across codebase
Run prettier --write to fix formatting inconsistencies in 80 files
across calendar, contacts, picture, presi, storage, zitare apps
and shared packages/documentation.
2025-12-03 02:02:09 +01:00

237 lines
5.3 KiB
TypeScript

/**
* Date utility functions for calendar operations
*/
/**
* Get the start of day for a given date
*/
export function startOfDay(date: Date): Date {
const result = new Date(date);
result.setHours(0, 0, 0, 0);
return result;
}
/**
* Get the end of day for a given date
*/
export function endOfDay(date: Date): Date {
const result = new Date(date);
result.setHours(23, 59, 59, 999);
return result;
}
/**
* Get the start of week for a given date
* @param date - The date
* @param weekStartsOn - 0 = Sunday, 1 = Monday
*/
export function startOfWeek(date: Date, weekStartsOn: 0 | 1 = 1): Date {
const result = new Date(date);
const day = result.getDay();
const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
result.setDate(result.getDate() - diff);
result.setHours(0, 0, 0, 0);
return result;
}
/**
* Get the end of week for a given date
* @param date - The date
* @param weekStartsOn - 0 = Sunday, 1 = Monday
*/
export function endOfWeek(date: Date, weekStartsOn: 0 | 1 = 1): Date {
const result = startOfWeek(date, weekStartsOn);
result.setDate(result.getDate() + 6);
result.setHours(23, 59, 59, 999);
return result;
}
/**
* Get the start of month for a given date
*/
export function startOfMonth(date: Date): Date {
const result = new Date(date);
result.setDate(1);
result.setHours(0, 0, 0, 0);
return result;
}
/**
* Get the end of month for a given date
*/
export function endOfMonth(date: Date): Date {
const result = new Date(date);
result.setMonth(result.getMonth() + 1);
result.setDate(0);
result.setHours(23, 59, 59, 999);
return result;
}
/**
* Get the start of year for a given date
*/
export function startOfYear(date: Date): Date {
const result = new Date(date);
result.setMonth(0, 1);
result.setHours(0, 0, 0, 0);
return result;
}
/**
* Get the end of year for a given date
*/
export function endOfYear(date: Date): Date {
const result = new Date(date);
result.setMonth(11, 31);
result.setHours(23, 59, 59, 999);
return result;
}
/**
* Add days to a date
*/
export function addDays(date: Date, days: number): Date {
const result = new Date(date);
result.setDate(result.getDate() + days);
return result;
}
/**
* Add weeks to a date
*/
export function addWeeks(date: Date, weeks: number): Date {
return addDays(date, weeks * 7);
}
/**
* Add months to a date
*/
export function addMonths(date: Date, months: number): Date {
const result = new Date(date);
result.setMonth(result.getMonth() + months);
return result;
}
/**
* Add years to a date
*/
export function addYears(date: Date, years: number): Date {
const result = new Date(date);
result.setFullYear(result.getFullYear() + years);
return result;
}
/**
* Check if two dates are on the same day
*/
export function isSameDay(date1: Date, date2: Date): boolean {
return (
date1.getFullYear() === date2.getFullYear() &&
date1.getMonth() === date2.getMonth() &&
date1.getDate() === date2.getDate()
);
}
/**
* Check if a date is today
*/
export function isToday(date: Date): boolean {
return isSameDay(date, new Date());
}
/**
* Check if a date is in the past
*/
export function isPast(date: Date): boolean {
return date.getTime() < Date.now();
}
/**
* Check if a date is in the future
*/
export function isFuture(date: Date): boolean {
return date.getTime() > Date.now();
}
/**
* Get all days in a month as an array
*/
export function getDaysInMonth(year: number, month: number): Date[] {
const days: Date[] = [];
const date = new Date(year, month, 1);
while (date.getMonth() === month) {
days.push(new Date(date));
date.setDate(date.getDate() + 1);
}
return days;
}
/**
* Get the number of days in a month
*/
export function getMonthDayCount(year: number, month: number): number {
return new Date(year, month + 1, 0).getDate();
}
/**
* Format a date range for display
*/
export function formatDateRange(start: Date, end: Date): string {
const startStr = start.toLocaleDateString();
const endStr = end.toLocaleDateString();
if (isSameDay(start, end)) {
return startStr;
}
return `${startStr} - ${endStr}`;
}
/**
* Format a time for display (HH:MM)
*/
export function formatTime(date: Date): string {
return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
}
/**
* Parse an ISO date string to Date
*/
export function parseISODate(dateString: string | Date): Date {
if (dateString instanceof Date) {
return dateString;
}
return new Date(dateString);
}
/**
* Get week number of the year (ISO 8601)
*/
export function getWeekNumber(date: Date): number {
const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
const dayNum = d.getUTCDay() || 7;
d.setUTCDate(d.getUTCDate() + 4 - dayNum);
const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);
}
/**
* Get an array of hours in a day (0-23)
*/
export function getHoursInDay(): number[] {
return Array.from({ length: 24 }, (_, i) => i);
}
/**
* Calculate event duration in minutes
*/
export function getEventDurationMinutes(start: Date, end: Date): number {
return Math.round((end.getTime() - start.getTime()) / (1000 * 60));
}
/**
* Check if two time ranges overlap
*/
export function doTimeRangesOverlap(start1: Date, end1: Date, start2: Date, end2: Date): boolean {
return start1 < end2 && end1 > start2;
}