Ir al contenido principal

Vali-Holiday

IValiHoliday proporciona datos de feriados específicos por país para más de 35 países, incluyendo feriados móviles basados en la Pascua. Usa un patrón de proveedor — registras implementaciones de IHolidayProvider para los países que necesitas y luego consultas información de feriados por código de país.

Instalación

dotnet add package Vali-Holiday

Registro

builder.Services.AddValiHoliday();
// o mediante el meta-paquete:
builder.Services.AddValiTempo();

Clase HolidayInfo

HolidayInfo describe un feriado individual:

PropiedadTipoDescripción
NamestringNombre oficial del feriado
LocalNamestringNombre en el idioma principal del país
DateDateTimeFecha calendario del feriado
CountrystringCódigo de país ISO 3166-1 alpha-2
TypeHolidayTypeClasificación del feriado
IsObservedboolVerdadero si es una fecha sustituta observada
IsFixedboolVerdadero si la fecha es la misma cada año

Enumeración HolidayType

ValorDescripción
PublicFeriado público nacional
BankFeriado bancario (instituciones financieras cerradas)
SchoolFeriado escolar
OptionalFeriado opcional/regional
ObservanceObservancia (no necesariamente día no laborable)

API de IValiHoliday

Register

Registra un IHolidayProvider para uno o más países:

// Registrar todos los más de 35 países a la vez
foreach (var provider in HolidayProviderFactory.CreateAll())
holiday.Register(provider);

// Registrar solo países latinoamericanos
foreach (var provider in HolidayProviderFactory.CreateLatinAmerica())
holiday.Register(provider);

// Registrar un solo país
holiday.Register(new PeruHolidayProvider());

Firma: void Register(IHolidayProvider provider)

For

Obtiene todos los feriados de un país en un año dado:

IEnumerable<HolidayInfo> holidays = holiday.For("PE", 2025);
foreach (var h in holidays.OrderBy(h => h.Date))
Console.WriteLine($"{h.Date:MMM dd}{h.Name}");

Firma: IEnumerable<HolidayInfo> For(string country, int year)

Supports

Devuelve true si hay un proveedor de feriados registrado para el código de país dado:

bool supported = holiday.Supports("PE"); // → true si el proveedor de Perú está registrado

Firma: bool Supports(string country)

SupportedCountries

Devuelve todos los códigos de país que tienen proveedores registrados:

IEnumerable<string> countries = holiday.SupportedCountries();
// → ["PE", "US", "ES", "MX", ...]

Firma: IEnumerable<string> SupportedCountries()

IsHoliday

Devuelve true si una fecha dada es un feriado público en el país especificado:

bool isHoliday = holiday.IsHoliday("PE", new DateTime(2025, 7, 28));
// → true (Día de la Independencia del Perú)

bool isHoliday2 = holiday.IsHoliday("US", new DateTime(2025, 12, 25));
// → true (Navidad)

Firma: bool IsHoliday(string country, DateTime date)

GetHolidays

Obtiene todos los feriados para un año y país específicos (alias de For):

IEnumerable<HolidayInfo> list = holiday.GetHolidays("MX", 2025);

Firma: IEnumerable<HolidayInfo> GetHolidays(string country, int year)

GetNextHolidayWithYear

Devuelve el próximo feriado de un país en o después de una fecha dada:

HolidayInfo? next = holiday.GetNextHolidayWithYear("PE", DateTime.Today);
if (next is not null)
Console.WriteLine($"Next holiday: {next.Name} on {next.Date:MMM dd}");

Firma: HolidayInfo? GetNextHolidayWithYear(string country, DateTime from)

Sobrecarga obsoleta: GetNextHoliday() está marcado como [Obsolete]. Usa GetNextHolidayWithYear() en su lugar. La sobrecarga obsoleta devuelve solo HolidayInfo sin el año resuelto, lo que hace que los feriados móviles sean ambiguos.

GetPreviousHolidayWithYear

Devuelve el feriado más reciente de un país antes de una fecha dada:

HolidayInfo? prev = holiday.GetPreviousHolidayWithYear("US", DateTime.Today);

Firma: HolidayInfo? GetPreviousHolidayWithYear(string country, DateTime before)

Sobrecarga obsoleta: GetPreviousHoliday() está marcado como [Obsolete]. Usa GetPreviousHolidayWithYear() en su lugar. La sobrecarga obsoleta devuelve solo HolidayInfo sin el año resuelto, lo que hace que los feriados móviles sean ambiguos.

IsLongWeekend

Devuelve true si la fecha forma parte de un fin de semana largo (un feriado adyacente a un fin de semana):

// Ej., si un feriado de lunes crea un fin de semana de 3 días
bool longWknd = holiday.IsLongWeekend("US", new DateTime(2025, 5, 26)); // Memorial Day
// → true (lunes + fin de semana = fin de semana largo)

Firma: bool IsLongWeekend(string country, DateTime date)

HolidaysThisMonth

Devuelve todos los feriados en un mes dado para un país:

IEnumerable<HolidayInfo> thisMonth = holiday.HolidaysThisMonth(2025, 7, "PE");

Firma: IEnumerable<HolidayInfo> HolidaysThisMonth(int year, int month, string countryCode)

Nota: month debe estar en el rango [1, 12]; pasar un valor fuera de este rango lanza ArgumentOutOfRangeException.

Notas específicas por país

Argentina

El Domingo de Pascua (ar_easter) está tipificado como HolidayType.Observance en el proveedor de Argentina. Los feriados de tipo Observance se excluyen de las verificaciones nacionales de IsHoliday(), por lo que el Domingo de Pascua no devolverá true para Argentina al llamar a IsHoliday("AR", easterDate).

Chile

El Día de los Pueblos Indígenas es un feriado móvil basado en el ciclo astronómico del solsticio. Cae el 20 de junio en años bisiestos cercanos al ciclo del solsticio, y el 21 de junio en los demás.

Honduras

El proveedor de Honduras incluye el 17 de sep (Día del Maestro) como feriado cívico fijo y el Domingo de Pascua como feriado móvil.

Ejemplo completo

public class HolidayCalendarService(IValiHoliday holiday)
{
public void Initialize()
{
// Registrar todos los proveedores de América Latina
foreach (var provider in HolidayProviderFactory.CreateLatinAmerica())
holiday.Register(provider);

// Agregar EE. UU. y Europa
foreach (var provider in HolidayProviderFactory.CreateEurope())
holiday.Register(provider);
}

public void PrintYearHolidays(string country, int year)
{
if (!holiday.Supports(country))
{
Console.WriteLine($"No provider registered for '{country}'");
return;
}

var holidays = holiday.GetHolidays(country, year)
.OrderBy(h => h.Date);

Console.WriteLine($"Public holidays in {country} for {year}:");
foreach (var h in holidays)
Console.WriteLine($" {h.Date:ddd, MMM dd}{h.Name} ({h.Type})");
}

public bool IsGoodDayForPayment(string country, DateTime date)
{
return !holiday.IsHoliday(country, date)
&& date.DayOfWeek != DayOfWeek.Saturday
&& date.DayOfWeek != DayOfWeek.Sunday;
}
}