Date différence dans les années en utilisant C# [dupliquer]

cette question a déjà une réponse ici:

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.

58
demandé sur Peter Mortensen 2010-11-08 22:41:23

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);
87
répondu Richard J. Ross III 2016-11-22 17:27:37

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);
}
36
répondu dana 2016-11-22 17:29:34

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 .....
20
répondu Ruchir 2012-02-29 11:46:22

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;
    }
12
répondu davomcdavo 2018-01-06 05:20:55
var totalYears = 
    (DateTime.Today - new DateTime(2007, 03, 11)).TotalDays
    / 365.2425;

nombre Moyen de jours de Wikipedia/Leap_year .

5
répondu Albin Sunnanbo 2010-11-08 19:47:25

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);
4
répondu Ben Voigt 2010-11-08 22:04:22

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;
    }
3
répondu Felix 2012-01-03 11:58:22

si vous essayez d'obtenir l'âge de quelqu'un voir ce

comment calculer l'âge D'une personne en C#?

2
répondu Doggett 2017-05-23 12:18:16

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);
2
répondu Martin 2014-07-29 03:00:59
int Age = new DateTime((DateTime.Now - BirthDateTime).Ticks).Year;
1
répondu Predders 2014-02-04 13:20:00

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;
1
répondu bizl 2016-11-22 17:31:52

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)
0
répondu mattk 2011-06-04 08:28:48
    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);
    }
0
répondu Jens Borrisholt 2014-01-21 13:58:01
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
répondu Murat Sönmez 2015-04-20 17:05:29

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
répondu darkwood 2016-05-09 09:51:23

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
répondu Vedran 2016-11-22 17:33:05

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 .

0
répondu Nigrimmist 2016-11-22 17:34:33

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;
    }
}
0
répondu Numan Ali 2016-11-22 18:51:15

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;
}
0
répondu MarkTheCoder 2016-11-22 18:52:22

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

-2
répondu Zac 2010-11-08 22:43:49