Esto se basa en la respuesta anterior de Philippe Leybaert, pero maneja un caso de borde adicional que no veo explicado en ninguna de las respuestas anteriores.
El caso de borde que me estoy dirigiendo es cuando el cumpleaños es un día bisiesto, el cumpleaños es en el pasado para el año actual, y el año actual no es bisiesto pero el próximo año es.
La respuesta actual proporcionada dará como resultado un día menos ya que se establece "siguiente" al 28 de febrero del año actual y luego agrega un año la fecha 28 de febrero de un año bisiesto (que no es correcto). Cambiar una línea maneja esta caja de borde.
DateTime today = DateTime.Today;
DateTime next = birthday.AddYears(today.Year - birthday.Year);
if (next < today)
{
if (!DateTime.IsLeapYear(next.Year + 1))
next = next.AddYears(1);
else
next = new DateTime(next.Year + 1, birthday.Month, birthday.Day);
}
int numDays = (next - today).Days;
Actualización: Editado por Philippe señalando que mi código tenía un defecto bastante considerable.
surely a dupe? ... –
@Mitch - suena muy pero la búsqueda de texto completo no encontró una estafa en unos segundos, así que pensé en escribir la pregunta de manera articulada ... –
similar a http://stackoverflow.com/ preguntas/9/how-do-i-calculate-someones-age-in-c –