/* eslint-disable import/no-unassigned-import */ import dayjs, { type ConfigType } from 'dayjs'; import timezone from 'dayjs/plugin/timezone'; import utc from 'dayjs/plugin/utc'; import 'dayjs/locale/ru'; type DateTime = Exclude; if (!dayjs.prototype.tz) { dayjs.extend(utc); dayjs.extend(timezone); } dayjs.locale('ru'); const DEFAULT_TZ = 'Europe/Moscow'; /** * Склеивает дату (Date/string) и время (string, HH:mm) в datetime в нужной таймзоне, возвращает ISO строку в UTC */ export function combineDateAndTimeToUTC( date: DateTime, time: string, tz: string = DEFAULT_TZ, ): string { if (!date || !time) return ''; const dateString = dayjs(date).format('YYYY-MM-DD'); return dayjs.tz(`${dateString}T${time}`, tz).utc().toISOString(); } export function formatDate(datetime: DateTime) { return { db: () => dayjs(datetime).utc().toISOString(), user: (template?: string, tz: string = DEFAULT_TZ) => { return dayjs .utc(datetime) .tz(tz) .format(template || 'D MMMM YYYY'); }, }; } export function formatTime(datetime: ConfigType) { return { db: () => dayjs(datetime).utc().toISOString(), user: (tz: string = DEFAULT_TZ) => { return dayjs.utc(datetime).tz(tz).format('HH:mm'); }, }; } export function getDateUTCRange(date?: DateTime, tz: string = DEFAULT_TZ) { return { day: () => { const startOfDay = dayjs(date).tz(tz).startOf('day').utc().toISOString(); const endOfDay = dayjs(date).tz(tz).endOf('day').utc().toISOString(); return { endOfDay, startOfDay }; }, month: () => { const startOfMonth = dayjs(date).tz(tz).startOf('month').utc().toISOString(); const endOfMonth = dayjs(date).tz(tz).endOf('month').utc().toISOString(); return { endOfMonth, startOfMonth }; }, }; } export function getMinutes(time: string) { const [hours = '00', minutes = '00'] = time.split(':'); return Number.parseInt(hours, 10) * 60 + Number.parseInt(minutes, 10); } export function getTimeZoneLabel(tz: string = DEFAULT_TZ): string { if (tz === DEFAULT_TZ) return 'МСК'; const offset = dayjs().tz(tz).format('Z'); return `GMT${offset}`; } export function sumTime(datetime: DateTime, durationMinutes: number) { if (!datetime) return ''; return dayjs(datetime).add(durationMinutes, 'minute').toISOString(); }