2009-07-23 8 views
12

Ho un oggetto DateTime con il compleanno di una persona. Ho creato questo oggetto usando della persona anno, mese e giorno di nascita, nel seguente modo:Calcola giorni rimanenti per un compleanno?

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

Mi piacerebbe sapere quanti giorni rimangono prima che il prossimo compleanno di questa persona. Qual è il modo migliore per farlo in C# (sono nuovo della lingua)?

+0

sicuramente un dupes? ... –

+2

@Mitch - sembra così, ma la ricerca di testo completo non ha trovato un duplicato in pochi secondi, quindi ho pensato di scrivere la domanda in modo articolato ... –

+0

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

risposta

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; 

Questo algoritmo banale ha esito negativo se il compleanno è il 29 febbraio. Questa è l'alternativa (che è essenzialmente lo stesso come la risposta da 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 restituisce un doppio: http://msdn.microsoft.com/en-us/library/system.timespan.totaldays .aspx – Mac

+1

+1 Questo è vicino al modo "manuale" che sto usando in questo momento, ho pensato che forse c'è un trucco C# per semplificarlo. –

+0

@Mac: corretto. Grazie –

-1

provare questo metodo

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; 
} 

basta passare tua data di nascita e restituirà i giorni rimanenti prima del tuo prossimo compleanno

+2

Com'è diverso dalla risposta di Philippe? –

5

Utilizzando anno di oggi e il mese del compleanno e il giorno non funzionerà con bisestili anni.

Dopo un po 'di test, questo è quello che ho potuto lavorare:

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; 
} 

Testato con 29 febbraio su un salto di anni ed anche quando il compleanno è lo stesso giorno.

+1

Questo è l'unico metodo che funziona al 100%. Il motivo è che usa 'AddYears' che non fallisce mai per le ultime date di febbraio. – Gustav

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

Ha dovuto farlo solo ora per un programma. È abbastanza semplice rispetto agli altri metodi se tutto ciò di cui hai bisogno è un numero intero di giorni rimasti.

1

Questo si basa sulla risposta di Philippe Leybaert sopra, ma gestisce un caso di bordo aggiuntivo che non vedo rappresentato in nessuna delle risposte precedenti.

Il caso limite che sto affrontando è quando il compleanno è un giorno di salto, il compleanno è in passato per l'anno in corso, e l'anno in corso non è un anno bisestile, ma l'anno prossimo è.

L'attuale risposta fornita comporterà un giorno in meno in quanto imposta "il prossimo" al 28 febbraio dell'anno corrente e quindi aggiunge un anno alla data del 28 febbraio di un anno bisestile (che non è corretto). Cambiando una linea si maneggia questo caso limite.

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; 

Aggiornamento: Modificato per Philippe che indicava che il mio codice aveva un difetto piuttosto considerevole.

+0

Questo codice si arresta in modo anomalo quando l'anno di oggi è qualsiasi anno tranne un anno prima di un anno bisestile e quando il compleanno è il 29 febbraio. –

+0

Questa dovrebbe (ora) essere accettata in quanto gestisce correttamente tutte le date inclusi gli anni bisestili –

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(); 
     } 
    } 
} 
Problemi correlati