Date différence dans les années en utilisant C# [dupliquer]
cette question a déjà une réponse ici:
- comment calculer l'âge de Quelqu'un en C#? 64 réponses
Comment puis-je calculer la différence de date entre deux dates dans les années?
par exemple: (Datetime.Now.Today() - 11/03/2007)
en années.
20 réponses
j'ai écrit une implémentation qui fonctionne correctement avec des dates exactement à un an d'intervalle.
cependant, il ne gère pas avec élégance les temps négatifs, contrairement à l'autre algorithme. Il n'utilise pas non plus sa propre date arithmétique, au lieu de compter sur la bibliothèque standard pour cela.
donc sans plus attendre, 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);
utiliser:
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 une vérification 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 futiles, alors la durée est acceptable, mais si vous avez besoin pour calculer la pension de retraite, les dépôts à long terme ou quoi que ce soit d'autre à des fins financières, scientifiques ou juridiques, alors je crains que la durée ne sera pas assez précise parce que la durée 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 quelques années va varier (pour des raisons différentes qui sont en dehors de la portée de cette réponse). Pour contourner la limitation de Timespan alors vous pouvez imiter ce que fait Excel qui est:
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 de Wikipedia/Leap_year .
ce n'est pas clair comment vous voulez gérer les années fractionnaires, 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 place une méthode de prolongation pour obtenir le nombre d'années entre deux dates, arrondies 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 traiter automatiquement les années bissextiles. Il donne une réponse précise pour toutes les combinaisons de 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;
j'ai trouvé ceci à durée pour années, mois et 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;
si vous avez affaire à des mois et des années vous avez besoin de quelque chose qui sait combien de jours chaque mois A et quelles années sont des années bissextiles.
inscrire le calendrier grégorien (et autres mises en œuvre spécifiques à la culture calendrier ).
Alors que le Calendrier n'est pas de fournir des méthodes pour calculer directement la différence entre deux points dans le temps, il a des méthodes telles que
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
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;
}
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);
}
peut-être que cela sera 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 DateTime.DayOfYear Property .
C'est le meilleur code pour calculer la différence entre l'année et le 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;
}
}
ce qui suit est basé sur le code simple de Dana qui produit la réponse correcte dans la plupart des cas. Mais il n'a pas tenu compte de 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;
}
j'espère que le lien ci-dessous vous aidera
MSDN - DateTime.Soustraire.Méthode (DateTime)
il y a même des exemples pour C# là. Cliquez simplement sur l'onglet langue C#.
bonne chance