代码之家  ›  专栏  ›  技术社区  ›  msbyuva

使用c[副本]的年份日期差异

  •  69
  • msbyuva  · 技术社区  · 14 年前

    这个问题已经有了答案:

    我如何计算年中两个日期之间的日期差?

    例如: (Datetime.Now.Today() - 11/03/2007) 多年来。

    20 回复  |  直到 7 年前
        1
  •  100
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    我已经编写了一个实现,它可以正确地处理相隔一年的日期。

    但是,与其他算法不同,它不能优雅地处理负时间跨度。它也不使用自己的日期算法,而是依赖于标准库。

    因此,不用再多费吹灰之力,下面是代码:

    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);
    
        2
  •  39
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    用途:

    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);
    }
    
        3
  •  21
  •   Ruchir    12 年前

    我们必须对支票进行编码,以确定两个日期之间的差异是否大于2年,即开始日期和结束日期。

    由于上面的提示,完成如下:

     DateTime StartDate = Convert.ToDateTime("01/01/2012");
     DateTime EndDate = Convert.ToDateTime("01/01/2014");
     DateTime TwoYears = StartDate.AddYears(2);
    
     if EndDate > TwoYears .....
    
        4
  •  13
  •   davomcdavo    7 年前

    如果你需要它来了解某人的年龄是因为一些微不足道的原因,那么时间跨度是可以的,但是如果你需要计算退休金、长期存款或其他财务、科学或法律上的目的,那么时间跨度恐怕不够准确,因为时间跨度假定每年有相同的天数、相同的小时和相同的秒数)。

    事实上,有些年份的长度会有所不同(因为不同的原因,这些原因不在这个答案的范围之内)。为了克服时间跨度的限制,您可以模拟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;
        }
    
        5
  •  5
  •   Albin Sunnanbo    14 年前
    var totalYears = 
        (DateTime.Today - new DateTime(2007, 03, 11)).TotalDays
        / 365.2425;
    

    开始的平均天数 Wikipedia/Leap_year .

        6
  •  4
  •   Ben Voigt    14 年前

    目前还不清楚您希望如何处理分数年份,但可能是这样:

    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);
    
        7
  •  3
  •   Felix    13 年前

    我实现了一个扩展方法来获取两个日期之间的年数,用整个月份四舍五入。

        /// <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;
        }
    
        8
  •  3
  •   Martin    10 年前

    这是一个让系统自动处理闰年的巧妙技巧。它给出了所有日期组合的准确答案。

    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);
    
        9
  •  2
  •   Community rohancragg    7 年前

    如果你想让别人的年龄,看看这个

    How do I calculate someone's age in C#?

        10
  •  1
  •   Jens Borrisholt    11 年前
        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);
        }
    
        11
  •  1
  •   Predders    10 年前
    int Age = new DateTime((DateTime.Now - BirthDateTime).Ticks).Year;
    
        12
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    我发现了这个 TimeSpan for years, months and days :

    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;
    
        13
  •  0
  •   mattk    13 年前

    如果你处理的是月份和年份,你需要知道每个月有多少天,哪些年份是闰年。

    进入 Gregorian Calendar (以及其他特定文化 Calendar 实施)。

    虽然日历不提供直接计算两个时间点之间差异的方法,但它确实有一些方法,例如

    DateTime AddWeeks(DateTime time, int weeks)
    DateTime AddMonths(DateTime time, int months)
    DateTime AddYears(DateTime time, int years)
    
        14
  •  0
  •   Tim Abhishek Kumar    9 年前
    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
    
        15
  •  0
  •   ketan    8 年前

    作品完美:

        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;
        }
    
        16
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    简单解决方案:

    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);
    }
    
        17
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    也许这将有助于回答以下问题: 给定年份的天数 ,

    new DateTime(anyDate.Year, 12, 31).DayOfYear //will include leap years too
    

    关于 DateTime.DayOfYear Property .

        18
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    这是计算年和月差异的最佳代码:

    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;
        }
    }
    
        19
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    下面是基于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;
    }
    
        20
  •  -2
  •   Zac    14 年前

    希望下面的链接有帮助

    MSDN - DateTime.Subtract.Method (DateTime)

    甚至还有一些关于C的例子。只需单击“C语言”选项卡。

    祝你好运