first
This commit is contained in:
113
src/shared/date.util.ts
Normal file
113
src/shared/date.util.ts
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user