使用C#的年份差异

我怎样才能计算年份之间的date差异?

例如: (Datetime.Now.Today() - 11/03/2007)年。

我已经写了一个实现,正确地使用相隔一年的date。

但是,与其他algorithm不同的是,它不会优雅地处理负时间片。 它也没有使用自己的datealgorithm,而是依赖于标准库。

所以不要紧张,这里是代码:

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

使用:

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

我们必须编写一张支票来确定两个date之间的差异,开始date和结束date是否大于2年。

感谢上面的提示,做了如下:

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

时间跨度并不是答案,因为它假定每一年都有365天的时间,更不用说在几天甚至几秒内发生的其他变化。 如果你想模仿Excel做什么,那么这样做:

  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)// BUT the end day is less than the start day { years--; } else if (endDate.Month < startDate.Month)// 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; 

维基百科/ Leap_year的平均天数 。

目前还不清楚如何处理分数年,但也许是这样的:

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

我实现了一个扩展方法来获得两个date之间的年数,整整四个月。

  /// <summary> /// 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. /// </summary> /// <param name="start"> /// Stardate of time period /// </param> /// <param name="end"> /// Enddate of time period /// </param> /// <returns> /// Total Years between the two days /// </returns> 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; } 

如果你想让别人的年龄看到这一点

我如何计算C#中的某个人的年龄?

这是一个让系统自动处理闰年的巧妙技巧。 它给出了所有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; 

我在TimeSpanfind了这么多年,几个月和几天

 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; 

如果你要处理数月和数年,你需要知道每个月有多less天,哪些年份是闰年。

input公历 (和其他文化特定的日历实施)。

虽然日历不提供直接计算两个时间点之间的差异的方法,但它确实有方法

 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 

完美的作品:

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

简单的scheme:

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

也许这将有助于回答这个问题: 给定年份的天数

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

关于DateTime.DayOfYear属性

这是计算年月差的最佳代码:

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

以下是基于Dana简单的代码,它在大多数情况下都能产生正确的答案。 但是没有考虑到date之间不到一年的时间。 所以这里是我用来产生一致结果的代码:

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

我希望下面的链接帮助

MSDN – DateTime.Subtract.Method(DateTime)

那里甚至有C#的例子。 只需简单地点击C#语言标签。

祝你好运