2009-07-23 12 views
12

Tengo un objeto DateTime con el cumpleaños de una persona. He creado este objeto con el año de la persona, mes y día de nacimiento, de la siguiente manera:Calcula los días restantes para un cumpleaños?

DateTime date = new DateTime(year, month, day); 

Me gustaría saber cuántos días que quedan antes del próximo cumpleaños de esta persona. ¿Cuál es la mejor manera de hacerlo en C# (soy nuevo en el lenguaje)?

+0

surely a dupe? ... –

+2

@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 ... –

+0

similar a http://stackoverflow.com/ preguntas/9/how-do-i-calculate-someones-age-in-c –

Respuesta

21
// birthday is a DateTime containing the birthday 

DateTime today = DateTime.Today; 
DateTime next = new DateTime(today.Year,birthday.Month,birthday.Day); 

if (next < today) 
    next = next.AddYears(1); 

int numDays = (next - today).Days; 

Este algoritmo trivial falla si el cumpleaños es el 29 de febrero. Esta es la alternativa (que es esencialmente la misma que la respuesta por Seb Nilsson:

DateTime today = DateTime.Today; 
DateTime next = birthday.AddYears(today.Year - birthday.Year); 

if (next < today) 
    next = next.AddYears(1); 

int numDays = (next - today).Days; 
+1

TotalDays devuelve un doble: http://msdn.microsoft.com/en-us/library/system.timespan.totaldays .aspx – Mac

+1

+1 Esto está cerca de la forma "manual" que estoy usando en este momento, pensé que tal vez haya un truco de C# para simplificarlo. –

+0

@Mac: fijo. Gracias –

-1

probar este método

private int GetDaysBeforeBirthday(DateTime birthdate) 
{ 
    DateTime nextBday = new DateTime(DateTime.Now.Year, birthdate.Month, birthdate.Day); 
    if (DateTime.Today > nextBday) 
     nextBday = nextBday.AddYears(1); 
    return (nextBday - DateTime.Today).Days; 
} 

acaba de pasar su fecha de nacimiento y volverá los días que quedan antes de su próximo cumpleaños

+2

¿En qué se diferencia esto de la respuesta de Philippe? –

5

Usando años de hoy en día y el mes del cumpleaños y el día no funcionará con años bisiestos.

Después un poco de prueba, esto es lo que me pasa a trabajar:

private static int GetDaysUntilBirthday(DateTime birthday) { 
    var nextBirthday = birthday.AddYears(DateTime.Today.Year - birthday.Year); 
    if(nextBirthday < DateTime.Today) { 
     nextBirthday = nextBirthday.AddYears(1); 
    } 
    return (nextBirthday - DateTime.Today).Days; 
} 

Probado con 29 de febrero los años un salto y también cuando el cumpleaños es el mismo día.

+1

Este es el único método que funciona al 100%. La razón es que usa 'AddYears' que nunca falla para las últimas fechas de febrero. – Gustav

-1
 DateTime Variable = DateTime.Now; 
     int NumOfDaysTillNextMonth = 0; 
     while (Variable < Comparer) //Comparer is just a target datetime 
     { 
      Variable = Variable.AddDays(1); 
      NumOfDaysTillNextMonth++; 
     } 

Tenía que hacer esto ahora mismo para un programa. Es lo suficientemente simple como opuesto a los otros métodos si todo lo que necesita es un número entero de días restantes.

1

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.

+0

Este código falla cuando el año de hoy es cualquier año excepto un año antes de un año bisiesto y cuando el cumpleaños es el 29 de febrero. –

+0

Esto debería (ahora) ser aceptado, ya que maneja correctamente todas las fechas, incluidos los años bisiestos –

0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DateTime dt1 = DateTime.Parse("09/08/2012"); 
      DateTime dt2 = DateTime.Parse(DateTime.Now.ToString()); 
      int days = (dt2 - dt1).Days; 
      Console.WriteLine(days); 

      double month = (dt2 - dt1).Days/30; 
      Console.WriteLine(month); 
      double year = (dt2 - dt1).Days/365; 
      Console.WriteLine(year); 
      Console.Read(); 
     } 
    } 
} 
Cuestiones relacionadas