web-dev-qa-db-fra.com

Date différence en années en utilisant C #

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.

71
msbyuva

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

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

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 .....
23
Ruchir

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;
    }
13
davomcdavo
var totalYears = 
    (DateTime.Today - new DateTime(2007, 03, 11)).TotalDays
    / 365.2425;

Nombre moyen de jours à partir de Wikipedia/Leap_year .

6
Albin Sunnanbo

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);
4
Ben Voigt

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

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

Si vous essayez d'avoir l'âge de quelqu'un, voyez ceci

Comment calculer l'âge de quelqu'un en C #?

2
Doggett
int Age = new DateTime((DateTime.Now - BirthDateTime).Ticks).Year;
1
Predders

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;
1
bizl
    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);
    }
1
Jens Borrisholt

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)
0
mattk

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

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;
}
0
MarkTheCoder
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
0
Murat Sönmez

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

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;
    }
}
0
Numan Ali

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.

0
Nigrimmist