2011-01-20 16 views
6
DateTime dayStart; 
DateTime dateEnd; 

TimeSpan ts = dateEnt - dateStart; 

Stampa: ... Anno (s) e ... Month (s)come trovare la differenza di anno e mese tra due date?

come posso calcolarlo?

.net framework 2.0
C#

progetto asp.net.

+0

Sono necessarie (molte) definizioni qui. Quanti mesi tra il 31-01-2011 e il 01-02-2011? Se vuoi le frazioni, quanto dura un mese? –

risposta

3

Dipende da ciò che si desidera calcolare esattamente.

Non è possibile tradurre il valore in un TimeSpan in anni esatti e in mesi, poiché la durata degli anni e dei mesi varia. È possibile calcolare anni approssimativi e mesi in questo modo:

int years = ts.Days/365; 
int months = (ts.Days % 365)/31; 

Se si desidera che la differenza esatta, è necessario confrontare i valori DateTime.

7

You should first read this article da Jon Skeet, in particolare dal testo "Introducing periods and period arithmetic" diventa interessante per voi.

Quindi, è necessario definire quando un certo periodo è un cambiamento nel mese, anno, ecc

Noda-time contiene già un sacco di funzioni per questo. Ma non penso che sia ancora stato rilasciato.

+1

Gah, qual è il punto su cui vengo a una domanda tutta eccitata dalla prospettiva di menzionare Noda Time se gli altri lo fanno per me? ;) –

+0

@Jon: Mi dispiace, ho appena ricordato che ho letto l'articolo. – GvS

+0

Wow, non avevo mai sentito parlare di Noda-Time, e non ho mai veramente pensato alla complessità del calcolo degli intervalli di data/ora. Leggendo il link postato per la prima volta continuo a pensare "Sì ... è vero, come mai non ci ho mai pensato?" +1 per averlo pubblicato e di nuovo, grazie ai creatori di StackOverflow per avermi dato qualcosa di nuovo da pensare a permettere a questo vecchio cane di imparare un altro nuovo trucco. – David

2

penso che qualcosa di simile sarebbe farlo:

DateTime date1 = new DateTime(1973, 07, 20); 
    DateTime date2 = new DateTime(2010, 01, 10); 

    // Swap them if one is bigger than the other 
    if (date2 < date1) 
    { 
    DateTime date3 = date2; 
    date2 = date1; 
    date1 = date3; 
    } 

    // Now date2 >= date1. 

    TimeSpan ts = date2 - date1; 

    // Total days 
    Console.WriteLine(ts.TotalDays); 

    // Total years 
    int years = date2.Year - date1.Year; 

    int months = 0; 
    // Total monts 
    if (date2.Month < date1.Month) 
    { 
    // example: March 2010 (3) and January 2011 (1); this should be 10 monts 
    // 12 - 3 + 1 = 10 
    // Take the 12 months of a year into account 
    months = 12 - date1.Month + date2.Month; 
    } 
    else 
    { 
    months = date2.Month - date1.Month; 
    } 
    Console.WriteLine("Years: {0}, Months: {1}", years, months); 

Modifica Per chiarire: Non c'è alcuna necessità di algorhitms data complicati o qualsiasi di questo genere di cose, perché ci sono sempre 12 mesi in un anno (almeno nel nostro calendario).

3

seguito calcolerà l'età in anni, mesi, giorni

DateTime dob = "1981/10/18"; // data di nascita DateTime now = DateTime.Now;

 // Swap them if one is bigger than the other 
     if (now < dob) 
     { 
      DateTime date3 = now; 
      now = dob; 
      dob = date3; 
     } 
     TimeSpan ts = now - dob; 
     //Debug.WriteLine(ts.TotalDays); 

     int years = 0; 
     int months = 0, days=0; 
     if ((now.Month <= dob.Month) && (now.Day < dob.Day)) // i.e. now = 03Jan15, dob = 23dec14 
     { 
      // example: March 2010 (3) and January 2011 (1); this should be 10 months. // 12 - 3 + 1 = 10 
      years = now.Year - dob.Year-1; 
      months = 12 - dob.Month + now.Month-1; 
      days = DateTime.DaysInMonth(dob.Year, dob.Month) - dob.Day + now.Day; 

      if(months==12) 
      { 
       months=0; 
       years +=1; 
      } 
     } 
     else if ((now.Month <= dob.Month) && (now.Day >= dob.Day)) // i.e. now = 23Jan15, dob = 20dec14 
     { 
      // example: March 2010 (3) and January 2011 (1); this should be 10 months. // 12 - 3 + 1 = 10 
      years = now.Year - dob.Year - 1; 
      months = 12 - dob.Month + now.Month; 
      days = now.Day - dob.Day; 
      if (months == 12) 
      { 
       months = 0; 
       years += 1; 
      } 
     } 
     else if ((now.Month > dob.Month) && (now.Day < dob.Day)) // i.e. now = 18oct15, dob = 22feb14 
     { 
      years = now.Year - dob.Year; 
      months = now.Month - dob.Month-1; 
      days = DateTime.DaysInMonth(dob.Year, dob.Month) - dob.Day + now.Day; 
     } 
     else if ((now.Month > dob.Month) && (now.Day >= dob.Day)) // i.e. now = 22oct15, dob = 18feb14 
     { 
      years = now.Year - dob.Year; 
      months = now.Month - dob.Month; 
      days = now.Day - dob.Day; 
     } 
     Debug.WriteLine("Years: {0}, Months: {1}, Days: {2}", years, months, days); 
Problemi correlati