Разница дат в годах с использованием C# [дубликат]
этот вопрос уже есть ответ здесь:
- как вычислить чей-то возраст в C#? 64 ответы
Как я могу вычислить разницу между двумя датами в годах?
например: (Datetime.Now.Today() - 11/03/2007)
В года.
20 ответов:
Я написал реализацию, которая правильно работает с датами ровно один год.
однако он не изящно обрабатывает отрицательные промежутки времени, в отличие от другого алгоритма. Он также не использует свою собственную арифметику даты, вместо этого полагаясь на стандартную библиотеку для этого.
Итак, без дальнейших церемоний, вот код:
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); }
мы должны были кодировать проверку, чтобы установить, если разница между двумя датами, начальная и конечная дата была больше, чем 2 года.
благодаря советам выше это было сделано следующим образом:
DateTime StartDate = Convert.ToDateTime("01/01/2012"); DateTime EndDate = Convert.ToDateTime("01/01/2014"); DateTime TwoYears = StartDate.AddYears(2); if EndDate > TwoYears .....
Если вам это нужно, зная, что кто-то возраст по тривиальным причинам, то сроки в порядке, но если вам нужно для расчета пенсии по выслуге лет, долгосрочные депозиты или что-нибудь еще для финансовых, научных или юридических целей, то я боюсь, времени не будет достаточно точным, так как промежуток времени предполагает, что каждый год имеет то же количество дней, же # из и # секунд).
на самом деле продолжительность некоторых лет будет варьироваться (по разным причинам, которые выходят за рамки этот ответ.) Чтобы обойти ограничение Timespan, вы можете имитировать то, что делает 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// 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;
среднее количество дней с Википедия/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);
я реализовал метод расширения, чтобы получить количество лет между двумя датами, закругленные на целые месяцы.
/// <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; }
вот аккуратный трюк, который позволяет системе иметь дело с високосными годами автоматически. Это дает точный ответ для всех комбинаций дат.
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);
Я нашел это в промежуток времени для лет, месяцев и дней:
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;
Если вы имеете дело с месяцами и годами, вам нужно что-то, что знает, сколько дней каждый месяц имеет и какие годы високосные годы.
введите Григорианскому Календарю (и другие культурные особенности календарь реализации).
хотя календарь не предоставляет методы для прямого вычисления разницы между двумя точками во времени, у него есть такие методы, как
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; }
простое решение:
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 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; } }
следующее основано на простом коде Даны, который в большинстве случаев дает правильный ответ. Но это не учитывало менее года между датами. Итак, вот код, который я использую для получения последовательных результатов:
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.Вычитать.Метод (DateTime)
там даже есть примеры для C#. Просто перейдите на вкладку Язык C#.
удачи