Comment puis-je calculer la différence de date entre deux dates en années?
Par exemple: (Datetime.Now.Today() - 11/03/2007)
dans des années.
J'ai écrit une implémentation qui fonctionne correctement avec des dates bien séparées d'un an.
Cependant, il ne gère pas avec élégance les intervalles de temps négatifs, contrairement à l'autre algorithme. Il n'utilise pas non plus sa propre arithmétique de date, mais plutôt la bibliothèque standard.
Alors sans plus tarder, voici le code:
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);
Utilisation:
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);
}
Nous avons dû coder un chèque pour établir si la différence entre deux dates, une date de début et une date de fin était supérieure à 2 ans.
Merci aux conseils ci-dessus, il a été fait comme suit:
DateTime StartDate = Convert.ToDateTime("01/01/2012");
DateTime EndDate = Convert.ToDateTime("01/01/2014");
DateTime TwoYears = StartDate.AddYears(2);
if EndDate > TwoYears .....
Si vous en avez besoin pour connaître l'âge de quelqu'un pour des raisons triviales, alors Timespan est acceptable, mais si vous avez besoin de calculer une pension de retraite, des dépôts à long terme ou toute autre chose à des fins financières, scientifiques ou juridiques, je crains que Timespan ne soit pas suffisamment précis, car Timespan suppose que chaque année a le même nombre de jours, le même nombre d’heures et le même nombre de secondes).
En réalité, la durée de certaines années variera (pour différentes raisons, hors du domaine de cette réponse). Pour contourner la limitation de Timespan, vous pouvez imiter ce que fait Excel, à savoir:
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;
Nombre moyen de jours à partir de Wikipedia/Leap_year .
Vous ne savez pas comment vous voulez gérer des fractions d'années, mais peut-être comme ceci:
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);
J'ai mis en œuvre une méthode d'extension pour obtenir le nombre d'années entre deux dates, arrondi par mois entiers.
/// <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;
}
Voici une astuce qui permet au système de gérer les années bissextiles automatiquement. Il donne une réponse précise pour toutes les combinaisons de dates.
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);
Si vous essayez d'avoir l'âge de quelqu'un, voyez ceci
int Age = new DateTime((DateTime.Now - BirthDateTime).Ticks).Year;
J'ai trouvé ceci à TimeSpan pour les années, les mois et les jours:
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;
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);
}
Si vous avez affaire à des mois et des années, vous avez besoin de quelque chose qui sache combien de jours par mois et quelles années sont des années bissextiles.
Entrez le calendrier grégorien (et d'autres implémentations spécifiques à la culture calendrier ).
Si Calendar ne fournit pas de méthodes permettant de calculer directement la différence entre deux instants, il dispose de méthodes telles que
DateTime AddWeeks(DateTime time, int weeks)
DateTime AddMonths(DateTime time, int months)
DateTime AddYears(DateTime time, int years)
Solution simple:
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);
}
Ce qui suit est basé sur le code simple de Dana qui donne la réponse correcte dans la plupart des cas. Mais il n'a pas fallu compter moins d'un an entre les dates. Voici donc le code que j'utilise pour produire des résultats cohérents:
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;
}
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
Fonctionne parfaitement:
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;
}
C'est le meilleur code pour calculer la différence d'année et de mois:
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;
}
}
Cela sera peut-être utile pour répondre à la question: Nombre de jours dans une année donnée ,
new DateTime(anyDate.Year, 12, 31).DayOfYear //will include leap years too
Concernant propriété DateTime.DayOfYear.