monitoring-app/src/shared/utils/formatDateTime.ts

52 lines
1.7 KiB
TypeScript

/**
* Formata uma string no formato "YYYY-MM-DD HH:mm:ss"
* para "DD/MM/YYYY" e "HH:mm".
*
* Inclui validação para entradas inválidas, nulas ou em formatos diferentes.
*/
export function formatDateTime(datetimeString: unknown) {
// 1 Verifica se o valor foi fornecido
if (!datetimeString) {
return { formattedDate: '-', formattedTime: '-' };
}
// 2 Converte para string de forma segura (caso venha como Date, número, etc.)
const value = String(datetimeString).trim();
// 3 Se for uma string vazia, retorna padrão
if (value.length === 0) {
return { formattedDate: '-', formattedTime: '-' };
}
// 4 Caso o valor seja uma data ISO (ex: "2025-11-09T12:30:00Z")
// ou algo que o construtor Date entenda, tenta converter
if (!value.includes(' ') && value.includes('T')) {
const dateObj = new Date(value);
if (!isNaN(dateObj.getTime())) {
return {
formattedDate: dateObj.toLocaleDateString('pt-BR'),
formattedTime: dateObj.toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })
};
}
}
// 5 Tenta separar a data e a hora no formato esperado "YYYY-MM-DD HH:mm:ss"
const parts = value.split(' ');
if (parts.length < 1 || parts[0].split('-').length !== 3) {
return { formattedDate: '-', formattedTime: '-' }; // formato inválido
}
const [datePart, timePart] = parts;
const [year, month, day] = datePart.split('-');
// 6 Verifica se os componentes da data são válidos
if (!year || !month || !day || year.length !== 4) {
return { formattedDate: '-', formattedTime: '-' };
}
// 7 Retorna a data e hora formatadas
return {
formattedDate: `${day}/${month}/${year}`,
formattedTime: timePart ? timePart.substring(0, 5) : '-'
};
}