/
vinderman
/
presentation
Обзор
Документация
Войти
/
vinderman
/
presentation
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
ui/DateCalendar/utils/date.ts
1 строка
4 KB
kalev
initial commit
06 май 2024, 12:05
06 май 2024, 12:05
4258fa9
Код
Авторство
О чём код?
export function getDaysInMonthCount(date: Date): number { const dateCopy = new Date(date) // берем следующий месяц, и сдвигаемся на день раньше, получая последний день нужного нам месяца dateCopy.setMonth(dateCopy.getMonth() + 1, 0) return dateCopy.getDate() } export function oneMonthAgo(date: Date): Date { date = new Date(date) const month = date.getMonth() date.setMonth(month - 1) // Handle when days in month are different if (date.getMonth() === month) { date.setDate(0) } return date } export function oneMonthAhead(date: Date): Date { date = new Date(date) const month = date.getMonth() date.setMonth(month + 1) // Handle when days in month are different if (date.getMonth() === (month + 2) % 12) { date.setDate(0) } return date } export function addYears(date: Date, numberOfYears: number): Date { date = new Date(date) const month = date.getMonth() date.setFullYear(date.getFullYear() + numberOfYears) // Handle Feb 29th for leap years if (date.getMonth() !== month) { date.setDate(0) } return date } export function oneYearAgo(date: Date): Date { return addYears(date, -1) } export function oneYearAhead(date: Date): Date { return addYears(date, 1) } function isDayDisabled(date: Date, min?: string, max?: string): boolean { const isBeforeMin = min && isDateValid(min) && new Date(min).getTime() > date?.getTime() const isAfterMax = max && isDateValid(max) && new Date(max).getTime() < date?.getTime() return Boolean(isBeforeMin || isAfterMax) } export interface MonthMatrixDay { day?: number date: Date disabled?: boolean } // Получить по дате массив, состоящий из подмассивов с неделями, где элементами являются конкретные дни export function getMonthMatrix( date: Date, min?: string, max?: string ): MonthMatrixDay[][] { const activeYear = date.getFullYear() const activeMonth = date.getMonth() const firstDayInMonth = new Date(activeYear, activeMonth, 1) const daysInMonthCount = getDaysInMonthCount(date) const startIndex = firstDayInMonth.getDay() || 7 let currentDay = 1 - startIndex const matrix = [] for (let week = 0; week < 6 && currentDay < daysInMonthCount; week++) { matrix[week] = [] as any[] for (let day = 0; day < 7; day++) { currentDay++ const date = new Date(activeYear, activeMonth, currentDay) if (currentDay < 1 || currentDay > daysInMonthCount) { matrix[week].push({ disabled: true, date }) continue } const day = date.getDate() matrix[week].push({ day, date, disabled: isDayDisabled(date, min, max) }) } } return matrix } /** Создание объекта Date из строки DD.MM.YYYY */ export function parseLocalDateString(value: string): Date | undefined { const dateParts = value.split('.') if (dateParts.length !== 3) { return undefined } const [day, month, year] = dateParts.map(Number) return new Date(year, month - 1, day) } /** Создание объекта Date из строки YYYY-MM-DD или другого объекта Date */ export function createDate(value: string | Date): Date { if (value instanceof Date) { return value } return new Date(value) } /** Форматирование объекта Date к строке формата `YYYY-MM-DD` */ export function formatDateToISO(value: Date): string { // учитываем часовой пояс, чтобы не изменилась дата, когда обрежем данные о времени у ISO формата const timezoneOffset = value.getTimezoneOffset() * 60000 return new Date(value.getTime() - timezoneOffset).toISOString().split('T')[0] } export function isDateValid(dateStr: string): boolean { return Boolean(dateStr) && !Number.isNaN(new Date(dateStr)) }