/** * Utilitários para manipulação de datas no backend * Resolve problemas de timezone ao trabalhar com datas no formato YYYY-MM-DD */ /** * Converte uma string de data no formato YYYY-MM-DD para um objeto Date local * No ambiente Convex, as datas são tratadas como UTC, então precisamos garantir * que a data seja interpretada corretamente. * * @param dateString - String no formato YYYY-MM-DD * @returns Date objeto representando a data * * @example * parseLocalDate('2024-01-15') // Retorna Date para 15/01/2024 */ export function parseLocalDate(dateString: string): Date { if (!dateString || typeof dateString !== 'string') { throw new Error('dateString deve ser uma string válida'); } // Validar formato YYYY-MM-DD const dateRegex = /^\d{4}-\d{2}-\d{2}$/; if (!dateRegex.test(dateString)) { throw new Error('dateString deve estar no formato YYYY-MM-DD'); } // Extrair ano, mês e dia const [year, month, day] = dateString.split('-').map(Number); // No Convex, criar a data usando UTC para evitar problemas de timezone // Usamos UTC para garantir consistência, mas mantemos a data correta const date = new Date(Date.UTC(year, month - 1, day, 0, 0, 0, 0)); // Validar se a data é válida if (isNaN(date.getTime())) { throw new Error(`Data inválida: ${dateString}`); } return date; } /** * Formata uma data para o formato brasileiro (DD/MM/YYYY) * * @param date - Date objeto ou string no formato YYYY-MM-DD * @returns String formatada no formato DD/MM/YYYY */ export function formatarDataBR(date: Date | string): string { let dateObj: Date; if (typeof date === 'string') { dateObj = parseLocalDate(date); } else { dateObj = date; } // Usar UTC para garantir consistência const day = dateObj.getUTCDate().toString().padStart(2, '0'); const month = (dateObj.getUTCMonth() + 1).toString().padStart(2, '0'); const year = dateObj.getUTCFullYear(); return `${day}/${month}/${year}`; }