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:
| Propiedad | Tipo | Descripción |
|---|---|---|
Name | string | Nombre oficial del feriado |
LocalName | string | Nombre en el idioma principal del país |
Date | DateTime | Fecha calendario del feriado |
Country | string | Código de país ISO 3166-1 alpha-2 |
Type | HolidayType | Clasificación del feriado |
IsObserved | bool | Verdadero si es una fecha sustituta observada |
IsFixed | bool | Verdadero si la fecha es la misma cada año |
Enumeración HolidayType
| Valor | Descripción |
|---|---|
Public | Feriado público nacional |
Bank | Feriado bancario (instituciones financieras cerradas) |
School | Feriado escolar |
Optional | Feriado opcional/regional |
Observance | Observancia (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]. UsaGetNextHolidayWithYear()en su lugar. La sobrecarga obsoleta devuelve soloHolidayInfosin 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]. UsaGetPreviousHolidayWithYear()en su lugar. La sobrecarga obsoleta devuelve soloHolidayInfosin 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:
monthdebe estar en el rango [1, 12]; pasar un valor fuera de este rango lanzaArgumentOutOfRangeException.
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;
}
}