UNPKG

@koalarx/utils

Version:

Biblioteca com validadores, conversores e abstrações de algumas problemáticas

153 lines (152 loc) 6.05 kB
"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); }