@koalarx/utils
Version:
Biblioteca com validadores, conversores e abstrações de algumas problemáticas
153 lines (152 loc) • 6.05 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.KlDate = void 0;
exports.isHoliday = isHoliday;
const date_fns_1 = require("date-fns");
// eslint-disable-next-line @typescript-eslint/no-var-requires
const Holidays = require('date-holidays');
class KlDate extends Date {
/**
* Formata a data atual em uma string com base no padrão fornecido.
* @param mask Máscara de formatação (ex.: 'dd/MM/yyyy HH:mm:ss').
* @returns Uma string representando a data formatada.
*/
format(mask) {
return (0, date_fns_1.format)(this, mask || 'dd/MM/yyyy HH:mm:ss');
}
/**
* Altera o fuso horário (GMT) da data atual.
* @param timeZone String representando o GMT (ex.: '+3', '-2').
* @returns Uma nova instância de `KlDate` com o GMT ajustado.
*/
changeTimeZone(timeZone) {
return new KlDate(this.toLocaleString('en-US', { timeZone }));
}
/**
* Converte a data atual para o formato UTC.
* @returns Uma nova instância de `KlDate` no formato UTC.
*/
toUTC() {
return new KlDate(this.toLocaleString('en-US', {
timeZone: 'UTC',
}));
}
/**
* Adiciona uma quantidade de tempo à data atual.
* @param qty Quantidade de tempo a ser adicionada.
* @param type Tipo de unidade de tempo (ex.: 'seconds', 'days', 'months').
* @param options Opções para ignorar feriados ou dias específicos.
* @returns A própria instância de `KlDate` com a data ajustada.
*/
add(qty, type, options) {
switch (type) {
case 'seconds':
this.setSeconds(this.getSeconds() + qty);
break;
case 'minutes':
this.setMinutes(this.getMinutes() + qty);
break;
case 'hours':
this.setHours(this.getHours() + qty);
break;
case 'days':
this.setDate(this.getDate() + qty);
break;
case 'months':
this.setMonth(this.getMonth() + qty);
break;
case 'years':
this.setFullYear(this.getFullYear() + qty);
break;
}
// Ignora feriados ou dias específicos, se configurado.
if ((options?.skipHolidays && this.isHoliday(options.skipHolidays.country)) ||
(options?.skipDays && options.skipDays.includes(this.getDay()))) {
this.add(1, 'days', options);
}
return this;
}
/**
* Subtrai uma quantidade de tempo da data atual.
* @param qty Quantidade de tempo a ser subtraída.
* @param type Tipo de unidade de tempo (ex.: 'seconds', 'days', 'months').
* @param options Opções para ignorar feriados ou dias específicos.
* @returns A própria instância de `KlDate` com a data ajustada.
*/
sub(qty, type, options) {
switch (type) {
case 'seconds':
this.setSeconds(this.getSeconds() - qty);
break;
case 'minutes':
this.setMinutes(this.getMinutes() - qty);
break;
case 'hours':
this.setHours(this.getHours() - qty);
break;
case 'days':
this.setDate(this.getDate() - qty);
break;
case 'months':
this.setMonth(this.getMonth() - qty);
break;
case 'years':
this.setFullYear(this.getFullYear() - qty);
break;
}
// Ignora feriados ou dias específicos, se configurado.
if ((options?.skipHolidays && this.isHoliday(options.skipHolidays.country)) ||
(options?.skipDays && options.skipDays.includes(this.getDay()))) {
return this.sub(1, 'days', options);
}
return this;
}
/**
* Calcula a diferença entre a data atual e outra data fornecida.
* @param date A data para calcular a diferença.
* @param type Tipo de unidade de tempo para o cálculo (ex.: 'seconds', 'days').
* @returns A diferença entre as datas na unidade especificada.
*/
diff(date, type) {
const diffInMs = Math.abs(this.getTime() - date.getTime());
switch (type) {
case 'seconds':
return Math.floor(diffInMs / 1000);
case 'minutes':
return Math.floor(diffInMs / (1000 * 60));
case 'hours':
return Math.floor(diffInMs / (1000 * 60 * 60));
case 'days':
return Math.floor(diffInMs / (1000 * 60 * 60 * 24));
case 'months':
return Math.floor(diffInMs / (1000 * 60 * 60 * 24 * 30));
case 'years':
return Math.floor(diffInMs / (1000 * 60 * 60 * 24 * 365));
}
}
/**
* Verifica se a data atual é um feriado no país especificado.
* @param country Código do país (ex.: 'BR' para Brasil).
* @returns `true` se a data atual for um feriado no país especificado, caso contrário `false`.
*
* Esta função utiliza a biblioteca `date-holidays` para determinar se a data atual
* corresponde a um feriado oficial no país informado. A data é ajustada para garantir
* que a verificação seja precisa, mesmo em diferentes fusos horários.
*/
isHoliday(country = 'BR') {
const hd = new Holidays(country);
const date = new Date(this.toDateString());
date.setHours(1);
return !!hd.isHoliday(date);
}
}
exports.KlDate = KlDate;
/**
* Função utilitária para verificar se uma data específica é um feriado em um país.
* @param date Instância de `KlDate` ou `Date` para verificar.
* @param country Código do país (ex.: 'BR' para Brasil).
* @returns `true` se a data for um feriado no país especificado, caso contrário `false`.
*/
function isHoliday(date, country = 'BR') {
return new KlDate(date).isHoliday(country);
}