Ir al contenido principal

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:

PropiedadTipoDescripción
YearsintAños completos transcurridos
MonthsintMeses restantes (0–11)
DaysintDías restantes (0–30)
TotalDaysintTotal de días desde la fecha de nacimiento
BirthdateDateTimeFecha 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 ArgumentOutOfRangeException cuando reference es 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)}");
}
}