سؤال

هذا السؤال سبق الجواب هنا:

كيف يمكنني حساب تاريخ الفرق بين تاريخين في سنوات ؟

على سبيل المثال: (Datetime.Now.Today() - 11/03/2007) في سنوات.

هل كانت مفيدة؟

المحلول

لقد كتبت تنفيذًا يعمل بشكل صحيح مع التواريخ التي تم تبادلها بشكل صحيح.

ومع ذلك ، فإنه لا يتعامل مع الأوقات الزمنية السلبية ، على عكس الخوارزمية الأخرى. كما أنه لا يستخدم الحساب الخاص به ، بدلاً من الاعتماد على المكتبة القياسية لذلك.

لذلك بدون مزيد من اللغط ، إليك الرمز:

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

اضطررنا إلى ترميز شيك لتحديد ما إذا كان الفرق بين تاريخين ، كان تاريخ البدء والنهاية أكبر من عامين.

بفضل النصائح المذكورة أعلاه ، تم على النحو التالي:

 DateTime StartDate = Convert.ToDateTime("01/01/2012");
 DateTime EndDate = Convert.ToDateTime("01/01/2014");
 DateTime TwoYears = StartDate.AddYears(2);

 if EndDate > TwoYears .....

إذا كنت في حاجة إليها لمعرفة عمر شخص ما لأسباب تافهة ، فستكون الوقت على ما يرام ، ولكن إذا كنت بحاجة إلى حساب التقاعد الفائقة أو الودائع طويلة الأجل أو أي شيء آخر لأغراض مالية أو علمية أو قانونية ، فأخشى أن تكون الزمنية دقيقة بما فيه الكفاية لأن الزمن تبرز يفترض أن كل عام لديه نفس العدد من الأيام ونفس ساعات الساعات ونفس الثواني).

في الواقع ، سيختلف طول بعض السنوات (لأسباب مختلفة خارج نطاق هذه الإجابة). للتغلب على قيود TimePan ، يمكنك تقليد ما يفعله 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;
    }

فيما يلي خدعة أنيقة تتيح للنظام التعامل مع سنوات Leap بشكل تلقائي. يعطي إجابة دقيقة لجميع مجموعات التاريخ.

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

إذا كنت تحاول الحصول على عمر شخص ما انظر هذا

كيف أحسب عمر شخص ما في C#؟

    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);
    }
int Age = new DateTime((DateTime.Now - BirthDateTime).Ticks).Year;

لقد وجدت هذا في تايمز سبان لسنوات وشهور وأيام:

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)
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.DayoFyear.

هذا هو أفضل رمز لحساب الفرق العام والشهر:

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

ويستند ما يلي عن رمز Dana البسيط الذي ينتج الإجابة الصحيحة في معظم الحالات. لكن الأمر لم يستغرق حساب أقل من عام بين التواريخ. لذا ، إليك الرمز الذي أستخدمه لإنتاج نتائج متسقة:

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.Subtract.method (DateTime)

هناك حتى أمثلة لـ C# هناك. ما عليك سوى النقر فوق علامة تبويب لغة C#.

حظا طيبا وفقك الله

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top