This commit is contained in:
Joelson
2025-09-17 18:49:23 -03:00
parent 21c3225c52
commit e081df9ced
42 changed files with 4129 additions and 411 deletions

113
src/shared/date.util.ts Normal file
View File

@@ -0,0 +1,113 @@
/**
* Utilitário para manipulação de datas no horário brasileiro
*/
export class DateUtil {
private static readonly BRAZIL_TIMEZONE = 'America/Sao_Paulo';
/**
* Obtém a data atual no horário brasileiro
* @returns Data atual no horário brasileiro
*/
static now(): Date {
return new Date();
}
/**
* Converte uma data para string no formato ISO com timezone brasileiro
* @param date Data a ser convertida
* @returns String da data no formato ISO com timezone brasileiro
*/
static toBrazilISOString(date: Date): string {
return date.toLocaleString('sv-SE', {
timeZone: this.BRAZIL_TIMEZONE,
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: false
}).replace(' ', 'T') + '.000Z';
}
/**
* Converte uma data para string formatada no horário brasileiro
* @param date Data a ser convertida
* @param format Formato desejado (padrão: 'dd/MM/yyyy HH:mm:ss')
* @returns String da data formatada no horário brasileiro
*/
static toBrazilString(date: Date, format: string = 'dd/MM/yyyy HH:mm:ss'): string {
const options: Intl.DateTimeFormatOptions = {
timeZone: this.BRAZIL_TIMEZONE,
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: false
};
const formatter = new Intl.DateTimeFormat('pt-BR', options);
const parts = formatter.formatToParts(date);
const year = parts.find(part => part.type === 'year')?.value;
const month = parts.find(part => part.type === 'month')?.value;
const day = parts.find(part => part.type === 'day')?.value;
const hour = parts.find(part => part.type === 'hour')?.value;
const minute = parts.find(part => part.type === 'minute')?.value;
const second = parts.find(part => part.type === 'second')?.value;
return format
.replace('dd', day || '')
.replace('MM', month || '')
.replace('yyyy', year || '')
.replace('HH', hour || '')
.replace('mm', minute || '')
.replace('ss', second || '');
}
/**
* Obtém timestamp atual no horário brasileiro
* @returns Timestamp em milissegundos
*/
static nowTimestamp(): number {
return Date.now();
}
/**
* Converte timestamp para data no horário brasileiro
* @param timestamp Timestamp em milissegundos
* @returns Data no horário brasileiro
*/
static fromTimestamp(timestamp: number): Date {
return new Date(timestamp);
}
/**
* Verifica se uma data está no horário de verão brasileiro
* @param date Data a ser verificada
* @returns true se estiver no horário de verão
*/
static isBrazilianDaylightSavingTime(date: Date): boolean {
const year = date.getFullYear();
// Horário de verão no Brasil geralmente vai de outubro a fevereiro
// (regras podem variar, esta é uma implementação simplificada)
const october = new Date(year, 9, 1); // Outubro
const february = new Date(year + 1, 1, 1); // Fevereiro do ano seguinte
return date >= october || date < february;
}
/**
* Obtém o offset do timezone brasileiro em minutos
* @param date Data para calcular o offset
* @returns Offset em minutos (negativo para oeste)
*/
static getBrazilTimezoneOffset(date: Date): number {
const utc = new Date(date.getTime() + (date.getTimezoneOffset() * 60000));
const brazil = new Date(utc.toLocaleString('en-US', { timeZone: this.BRAZIL_TIMEZONE }));
return (utc.getTime() - brazil.getTime()) / 60000;
}
}