mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-17 02:39:40 +02:00
Run prettier --write to fix formatting inconsistencies in 80 files across calendar, contacts, picture, presi, storage, zitare apps and shared packages/documentation.
237 lines
5.3 KiB
TypeScript
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;
|
|
}
|