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.
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.
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
.
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.
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? ;) –
@Jon: Mi dispiace, ho appena ricordato che ho letto l'articolo. – GvS
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
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).
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);
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? –