¿Cuántos años tienes? Resolviendo el cálculo de edad en C# de una vez por todas
\n\nPodría parecer sencillo: tomar la fecha actual, restar la fecha de nacimiento y obtener la edad. Pero cualquier desarrollador que haya escrito cálculo de edad en C# se ha encontrado con una trampa. Intente simplemente restar los años y obtendrá un error el día del cumpleaños. ¿Y qué hacer con los años bisiestos? ¿Y con las personas nacidas el 29 de febrero?
\n\nEsta pregunta es un verdadero éxito en Stack Overflow. Ha acumulado miles de visitas y docenas de respuestas. ¿Por qué? Porque calcular la edad a partir de la fecha de nacimiento en C# correctamente es más difícil de lo que parece. En este artículo no solo le daremos el código listo. Analizaremos las mejores prácticas de 2025, le enseñaremos a evitar errores y le mostraremos cómo escribir código limpio y confiable que no falle en producción.
\n\n¡Allá vamos! 🚀
\n\n¿Por qué la resta simple no funciona? (Y cómo solucionarlo)
\n\nEl error más común de los principiantes es usar la resta directa de años:
\n\nint age = DateTime.Now.Year - birthday.Year;\n\nA primera vista parece lógico. Pero imagine: hoy es 1 de marzo de 2025 y el cumpleaños del usuario es el 5 de marzo de 2010. Según esta lógica, ya tiene 15 años. Aunque en realidad todavía tiene 14. El error es que no hemos considerado si el cumpleaños ya pasó en el año actual.
\n\nLa segunda trampa son los años bisiestos. Los nacidos el 29 de febrero en un año no bisiesto deben celebrar el 28 de febrero o el 1 de marzo. Y su código debe manejar esto correctamente.
\n\nEl tercer problema es que DateTime.Now depende de la zona horaria del servidor. Si su servidor está en UTC y el usuario nació en Moscú, el cálculo puede fallar en el límite del día.
La buena noticia: todos estos problemas tienen solución. Y le mostraremos cómo.
\n\nLa mejor forma de calcular la edad en C# (Solución probada)
\n\nDespués de largos debates en Stack Overflow y múltiples pruebas, la comunidad llegó a un consenso. Aquí está la mejor práctica para calcular la edad en C# en 2025:
\n\npublic static int CalculateAge(DateTime birthDate, DateTime referenceDate)\n{\n // 1. Calculamos la diferencia en años\n int age = referenceDate.Year - birthDate.Year;\n\n // 2. Ajustamos si el cumpleaños aún no ha ocurrido este año\n if (referenceDate.Month < birthDate.Month || \n (referenceDate.Month == birthDate.Month && referenceDate.Day < birthDate.Day))\n {\n age--;\n }\n\n return age;\n}\n\n// Uso con la fecha actual\nDateTime birthday = new DateTime(1990, 6, 15);\nint age = CalculateAge(birthday, DateTime.Today);\nConsole.WriteLine($"Edad: {age} años");\n\n¿Por qué funciona esto?
\n- \n
- Diferencia de años — cálculo base. \n
- Ajuste — verificamos si el cumpleaños ya ocurrió este año. Si no, restamos 1 año. \n
DateTime.Today— usamos la fecha de hoy, noDateTime.Now, para evitar problemas con la hora del día. \n
Este método se considera canónico. Es simple, transparente y cubre el 99% de los casos.
\n\nTécnicas avanzadas: Extension Methods y manejo de casos límite
\n\nCreando un Extension Method conveniente
\n\nPara no escribir la misma lógica en cada proyecto, agregue un método de extensión para DateTime:
public static class DateTimeExtensions\n{\n public static int GetAge(this DateTime birthDate, DateTime? referenceDate = null)\n {\n var refDate = referenceDate ?? DateTime.Today;\n \n if (refDate < birthDate)\n throw new ArgumentException("La fecha de nacimiento no puede estar en el futuro.");\n \n int age = refDate.Year - birthDate.Year;\n \n if (refDate.Month < birthDate.Month || \n (refDate.Month == birthDate.Month && refDate.Day < birthDate.Day))\n