Vali-Age
IValiAge calcula edades exactas a partir de fechas de nacimiento. Maneja la convención de año bisiesto para el 29 de febrero (las personas nacidas el 29 de febrero celebran el 28 de febrero en años no bisiestos) y proporciona detección de cumpleaños, cálculo del próximo/anterior cumpleaños y descripciones de edad relativa.
Instalación
dotnet add package Vali-Age
Registro
builder.Services.AddValiAge();
// o mediante el meta-paquete:
builder.Services.AddValiTempo();
Struct AgeResult
AgeResult es un tipo de valor devuelto por Exact() que desglosa la edad en componentes:
| Propiedad | Tipo | Descripción |
|---|---|---|
Years | int | Años completos transcurridos |
Months | int | Meses restantes (0–11) |
Days | int | Días restantes (0–30) |
TotalDays | int | Total de días desde la fecha de nacimiento |
Birthdate | DateTime | Fecha de nacimiento original |
AgeResult age = valiAge.Exact(new DateTime(1990, 5, 10));
Console.WriteLine($"{age.Years}y {age.Months}m {age.Days}d");
// → "35y 2m 7d" (dependiendo de la fecha de hoy)
API de IValiAge
Years
Devuelve el número de años completos transcurridos desde la fecha de nacimiento:
int years = age.Years(new DateTime(1990, 5, 10));
// → ej. 35
Firma: int Years(DateTime birthdate, DateTime? referenceDate = null)
Exact
Devuelve un AgeResult detallado con el desglose en años, meses y días:
AgeResult result = age.Exact(new DateTime(1990, 5, 10));
// result.Years → 35
// result.Months → 2
// result.Days → 7
Firma: AgeResult Exact(DateTime birthdate, DateTime? referenceDate = null)
Format
Formatea la edad como una cadena legible para humanos:
string s1 = age.Format(new DateTime(1990, 5, 10));
// → "35 years old"
string s2 = age.Format(new DateTime(1990, 5, 10), detailed: true);
// → "35 years, 2 months, and 7 days"
Firma: string Format(DateTime birthdate, bool detailed = false, DateTime? referenceDate = null)
Relative
Devuelve una descripción de edad relativa:
string rel = age.Relative(new DateTime(2020, 1, 15));
// → "5 years ago" o "3 months ago" (para una fecha reciente)
string relBaby = age.Relative(DateTime.Today.AddDays(-40));
// → "40 days ago" o "about 1 month ago"
Firma: string Relative(DateTime birthdate, DateTime? referenceDate = null)
IsAtLeast
Devuelve true si la persona tiene al menos la edad dada en años:
bool adult = age.IsAtLeast(new DateTime(2000, 1, 1), 18);
// → true si nació en 2000 y hoy es 2018 o posterior
Firma: bool IsAtLeast(DateTime birthdate, int years, DateTime? referenceDate = null)
IsBirthday
Devuelve true si hoy (o la fecha de referencia) es el cumpleaños de la persona:
bool today = age.IsBirthday(new DateTime(1990, 3, 23));
// → true si hoy es el 23 de marzo
// Convención del 29 de feb: celebrado el 28 de feb en años no bisiestos
bool leapBday = age.IsBirthday(new DateTime(2000, 2, 29));
// → true el 28 de feb en años no bisiestos, el 29 de feb en años bisiestos
Firma: bool IsBirthday(DateTime birthdate, DateTime? referenceDate = null)
NextBirthday
Devuelve la fecha del próximo cumpleaños:
DateTime next = age.NextBirthday(new DateTime(1990, 5, 10));
// → 2026-05-10 (si hoy es antes del 10 de mayo de 2026)
// Si hoy es exactamente el cumpleaños, devuelve la fecha del año siguiente
Firma: DateTime NextBirthday(DateTime birthdate, DateTime? referenceDate = null)
PreviousBirthday
Devuelve la fecha del cumpleaños más reciente pasado:
DateTime prev = age.PreviousBirthday(new DateTime(1990, 5, 10));
// → 2025-05-10 (último cumpleaños que ya ha pasado)
Firma: DateTime PreviousBirthday(DateTime birthdate, DateTime? referenceDate = null)
Lanza
ArgumentOutOfRangeExceptioncuandoreferencees anterior al primer cumpleaños de la persona.
DaysUntilBirthday
Devuelve el número de días hasta el próximo cumpleaños:
int days = age.DaysUntilBirthday(new DateTime(1990, 5, 10));
// → ej. 48 (si hoy es el 23 de marzo y el cumpleaños es el 10 de mayo)
// Devuelve 0 si hoy es el cumpleaños
// Devuelve 365 (o 366) si hoy es el día después del cumpleaños
Firma: int DaysUntilBirthday(DateTime birthdate, DateTime? referenceDate = null)
Convención del 29 de febrero
Las personas nacidas el 29 de febrero se manejan de forma consistente:
- En años bisiestos: el cumpleaños es el 29 de febrero
- En años no bisiestos: el cumpleaños se trata como el 28 de febrero
Esta convención se aplica a IsBirthday, NextBirthday, PreviousBirthday y DaysUntilBirthday.
var leapBirthday = new DateTime(2000, 2, 29);
// En 2025 (no bisiesto):
bool isToday = age.IsBirthday(leapBirthday, new DateTime(2025, 2, 28));
// → true
// En 2024 (bisiesto):
bool isLeapDay = age.IsBirthday(leapBirthday, new DateTime(2024, 2, 29));
// → true
Ejemplo completo
public class UserProfileService(IValiAge age)
{
public void DisplayProfile(string name, DateTime birthdate)
{
int years = age.Years(birthdate);
AgeResult exact = age.Exact(birthdate);
bool isAdult = age.IsAtLeast(birthdate, 18);
bool birthday = age.IsBirthday(birthdate);
int daysLeft = age.DaysUntilBirthday(birthdate);
Console.WriteLine($"Name: {name}");
Console.WriteLine($"Age: {years} years");
Console.WriteLine($"Exact: {exact.Years}y {exact.Months}m {exact.Days}d");
Console.WriteLine($"Adult: {isAdult}");
if (birthday)
Console.WriteLine(" Happy Birthday!");
else
Console.WriteLine($" Next birthday in {daysLeft} days ({age.NextBirthday(birthdate):MMM dd})");
Console.WriteLine($"Relative: {age.Relative(birthdate)}");
Console.WriteLine($"Detail: {age.Format(birthdate, detailed: true)}");
}
}