Differenza di data in anni usando C #

Come posso calcolare la differenza di data tra due date in anni?

Ad esempio: (Datetime.Now.Today() - 11/03/2007) negli anni.

Ho scritto un’implementazione che funziona correttamente con date esattamente a distanza di un anno.

Tuttavia, a differenza degli altri algoritmi, non gestisce con grazia i timespex negativi. Inoltre, non usa la propria aritmetica data, ma fa affidamento sulla libreria standard per quello.

Quindi, senza ulteriori indugi, ecco il codice:

 DateTime zeroTime = new DateTime(1, 1, 1); DateTime a = new DateTime(2007, 1, 1); DateTime b = new DateTime(2008, 1, 1); TimeSpan span = b - a; // Because we start at year 1 for the Gregorian // calendar, we must subtract a year here. int years = (zeroTime + span).Year - 1; // 1, where my other algorithm resulted in 0. Console.WriteLine("Yrs elapsed: " + years); 

Uso:

 int Years(DateTime start, DateTime end) { return (end.Year - start.Year - 1) + (((end.Month > start.Month) || ((end.Month == start.Month) && (end.Day >= start.Day))) ? 1 : 0); } 

Abbiamo dovuto codificare un assegno per stabilire se la differenza tra due date, una data di inizio e di fine era superiore a 2 anni.

Grazie ai suggerimenti sopra è stato fatto come segue:

  DateTime StartDate = Convert.ToDateTime("01/01/2012"); DateTime EndDate = Convert.ToDateTime("01/01/2014"); DateTime TwoYears = StartDate.AddYears(2); if EndDate > TwoYears ..... 

Se ne hai bisogno per conoscere l’età di qualcuno per motivi futili, allora il tempo è OK, ma se hai bisogno di calcolare la pensione, depositi a lungo termine o qualsiasi altra cosa per scopi finanziari, scientifici o legali, allora temo che il tempo non sia abbastanza accurato perché presume che ogni anno abbia lo stesso numero di giorni, stesso # di ore e stesso # di secondi).

In realtà la durata di alcuni anni varierà (per ragioni diverse che esulano dallo scopo di questa risposta). Per aggirare il limite di tempo, allora puoi imitare ciò che fa Excel che è:

  public int GetDifferenceInYears(DateTime startDate, DateTime endDate) { //Excel documentation says "COMPLETE calendar years in between dates" int years = endDate.Year - startDate.Year; if (startDate.Month == endDate.Month &&// if the start month and the end month are the same endDate.Day < startDate.Day// AND the end day is less than the start day || endDate.Month < startDate.Month)// OR if the end month is less than the start month { years--; } return years; } 
 var totalYears = (DateTime.Today - new DateTime(2007, 03, 11)).TotalDays / 365.2425; 

Giorni medi da Wikipedia / Leap_year .

Non è chiaro come vuoi gestire gli anni frazionari, ma forse in questo modo:

 DateTime now = DateTime.Now; DateTime origin = new DateTime(2007, 11, 3); int calendar_years = now.Year - origin.Year; int whole_years = calendar_years - ((now.AddYears(-calendar_years) >= origin)? 0: 1); int another_method = calendar_years - ((now.Month - origin.Month) * 32 >= origin.Day - now.Day)? 0: 1); 

Ho implementato un metodo di estensione per ottenere il numero di anni tra due date, arrotondato per interi mesi.

  ///  /// Gets the total number of years between two dates, rounded to whole months. /// Examples: /// 2011-12-14, 2012-12-15 returns 1. /// 2011-12-14, 2012-12-14 returns 1. /// 2011-12-14, 2012-12-13 returns 0,9167. ///  ///  /// Stardate of time period ///  ///  /// Enddate of time period ///  ///  /// Total Years between the two days ///  public static double DifferenceTotalYears(this DateTime start, DateTime end) { // Get difference in total months. int months = ((end.Year - start.Year) * 12) + (end.Month - start.Month); // substract 1 month if end month is not completed if (end.Day < start.Day) { months--; } double totalyears = months / 12d; return totalyears; } 

Se stai cercando di far vedere la tua età a qualcuno

Come faccio a calcolare l’età di qualcuno in C #?

Ecco un trucco accurato che consente al sistema di gestire gli anni bisestili in modo automatico. Fornisce una risposta precisa per tutte le combinazioni di date.

 DateTime dt1 = new DateTime(1987, 9, 23, 13, 12, 12, 0); DateTime dt2 = new DateTime(2007, 6, 15, 16, 25, 46, 0); DateTime tmp = dt1; int years = -1; while (tmp < dt2) { years++; tmp = tmp.AddYears(1); } Console.WriteLine("{0}", years); 
 int Age = new DateTime((DateTime.Now - BirthDateTime).Ticks).Year; 

Ho trovato questo a TimeSpan per anni, mesi e giorni :

 DateTime target_dob = THE_DOB; DateTime true_age = DateTime.MinValue + ((TimeSpan)(DateTime.Now - target_dob )); // Minimum value as 1/1/1 int yr = true_age.Year - 1; 

Se hai a che fare con mesi e anni hai bisogno di qualcosa che sappia quanti giorni ogni mese ha e quali anni sono bisestili.

Inserisci il calendario gregoriano (e altre implementazioni del calendario specifiche per la cultura).

Mentre Calendar non fornisce metodi per calcolare direttamente la differenza tra due punti nel tempo, ha metodi come

 DateTime AddWeeks(DateTime time, int weeks) DateTime AddMonths(DateTime time, int months) DateTime AddYears(DateTime time, int years) 
  public string GetAgeText(DateTime birthDate) { const double ApproxDaysPerMonth = 30.4375; const double ApproxDaysPerYear = 365.25; int iDays = (DateTime.Now - birthDate).Days; int iYear = (int)(iDays / ApproxDaysPerYear); iDays -= (int)(iYear * ApproxDaysPerYear); int iMonths = (int)(iDays / ApproxDaysPerMonth); iDays -= (int)(iMonths * ApproxDaysPerMonth); return string.Format("{0} år, {1} måneder, {2} dage", iYear, iMonths, iDays); } 
 DateTime musteriDogum = new DateTime(dogumYil, dogumAy, dogumGun); int additionalDays = ((DateTime.Now.Year - dogumYil) / 4); //Count of the years with 366 days int extraDays = additionalDays + ((DateTime.Now.Year % 4 == 0 || musteriDogum.Year % 4 == 0) ? 1 : 0); //We add 1 if this year or year inserted has 366 days int yearsOld = ((DateTime.Now - musteriDogum).Days - extraDays ) / 365; // Now we extract these extra days from total days and we can divide to 365 

Funziona perfettamente:

  internal static int GetDifferenceInYears(DateTime startDate) { int finalResult = 0; const int DaysInYear = 365; DateTime endDate = DateTime.Now; TimeSpan timeSpan = endDate - startDate; if (timeSpan.TotalDays > 365) { finalResult = (int)Math.Round((timeSpan.TotalDays / DaysInYear), MidpointRounding.ToEven); } return finalResult; } 

Soluzione semplice:

 public int getYearDiff(DateTime startDate, DateTime endDate){ int y = Year(endDate) - Year(startDate); int startMonth = Month(startDate); int endMonth = Month(endDate); if (endMonth < startMonth) return y - 1; if (endMonth > startMonth) return y; return (Day(endDate) < Day(startDate) ? y - 1 : y); } 

Forse questo sarà utile per rispondere alla domanda: contare i giorni in un dato anno ,

 new DateTime(anyDate.Year, 12, 31).DayOfYear //will include leap years too 

Riguardo la proprietà DateTime.DayOfYear .

Questo è il miglior codice per calcolare la differenza di anno e mese:

 DateTime firstDate = DateTime.Parse("1/31/2019"); DateTime secondDate = DateTime.Parse("2/1/2016"); int totalYears = firstDate.Year - secondDate.Year; int totalMonths = 0; if (firstDate.Month > secondDate.Month) totalMonths = firstDate.Month - secondDate.Month; else if (firstDate.Month < secondDate.Month) { totalYears -= 1; int monthDifference = secondDate.Month - firstDate.Month; totalMonths = 12 - monthDifference; } if ((firstDate.Day - secondDate.Day) == 30) { totalMonths += 1; if (totalMonths % 12 == 0) { totalYears += 1; totalMonths = 0; } } 

Quanto segue si basa sul semplice codice di Dana che produce la risposta corretta nella maggior parte dei casi. Ma non ha tenuto conto di meno di un anno tra le date. Quindi, ecco il codice che uso per produrre risultati coerenti:

 public static int DateDiffYears(DateTime startDate, DateTime endDate) { var yr = endDate.Year - startDate.Year - 1 + (endDate.Month >= startDate.Month && endDate.Day >= startDate.Day ? 1 : 0); return yr < 0 ? 0 : yr; } 

Spero che il link sottostante aiuti

MSDN – DateTime.Subtract.Method (DateTime)

Ci sono anche esempi per C # lì. Basta semplicemente fare clic sulla linguetta C #.

In bocca al lupo