C# 使用C的年份日期差异#

C# 使用C的年份日期差异#,c#,date,datediff,C#,Date,Datediff,如何计算年内两个日期之间的日期差 例如:(Datetime.Now.Today()-11/03/2007)以年为单位。我已经编写了一个实现,可以正确地处理相隔一年的日期 但是,与其他算法不同,它不能优雅地处理负时间跨度。它也不使用自己的日期算法,而是依赖于标准库 不用多说,下面是代码: DateTime zeroTime=新的DateTime(1,1,1); DateTime a=新的DateTime(2007,1,1); DateTime b=新的DateTime(2008,1,1); 时间跨

如何计算年内两个日期之间的日期差


例如:
(Datetime.Now.Today()-11/03/2007)
以年为单位。

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

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

不用多说,下面是代码:

DateTime zeroTime=新的DateTime(1,1,1);
DateTime a=新的DateTime(2007,1,1);
DateTime b=新的DateTime(2008,1,1);
时间跨度=b-a;
//因为我们从公历的第一年开始
//日历,我们必须在这里减去一年。
整数年=(零时间+跨度);
//1,其中我的另一个算法得到0。
Console.WriteLine(“年过去:+年”);

不清楚您希望如何处理小数年,但可能是这样的:

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);
使用后的平均天数。

使用:

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

我希望下面的链接能有所帮助

这里甚至有C#的例子。只需单击C语言选项卡


祝你好运

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

输入(以及其他特定于区域性的实现)

虽然Calendar没有提供直接计算两个时间点之间差异的方法,但它确实有如下方法

DateTime AddWeeks(DateTime time, int weeks)
DateTime AddMonths(DateTime time, int months)
DateTime AddYears(DateTime time, int years)

我实现了一种扩展方法,以获得两个日期之间的年数,四舍五入为整月

    /// <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;
    }
//
///获取两个日期之间的总年数,四舍五入为整月。
///示例:
///2011-12-1412012-12-15返回1。
///2011-12-1412012-12-14返回1。
///2011-12-1412012-12-13返回09167。
/// 
/// 
///时段开始日期
/// 
/// 
///时间段的结束日期
/// 
/// 
///两天之间的总年数
/// 
公共静态双差总计(此日期时间开始,日期时间结束)
{
//获得总月份的差异。
整月=((年末-年初)*12)+(月末-月初);
//如果月末未完成,则减去1个月
如果(结束日<开始日)
{
月--;
}
双倍总年=月/12d;
回归年数;
}

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

多亏了上面的提示,操作如下:

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

 if EndDate > TwoYears .....
我在以下网站上找到:

要计算经过的年份(年龄),结果将为负1

var timeSpan = DateTime.Now - birthDateTime;
int age = new DateTime(timeSpan.Ticks).Year - 1;

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

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);
DateTime dt1=新的日期时间(1987,9,23,13,12,12,0);
DateTime dt2=新的日期时间(2007,6,15,16,25,46,0);
日期时间tmp=dt1;
整数年=-1;
而(tmp
如果你出于琐碎的原因需要了解某人的年龄,那么Timespan是可以的,但是如果你出于财务、科学或法律目的需要计算退休金、长期存款或其他任何东西,那么我担心Timespan不够准确,因为Timespan假设每年都有相同的天数,相同的小时数和相同的秒数)

事实上,某些年份的长度会有所不同(原因不同,超出了本答案的范围)。要绕过Timespan的限制,您可以模仿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;
    }
public int getDifferenceInEars(日期时间开始日期、日期时间结束日期)
{
//Excel文档显示“日期之间的完整日历年”
int YERS=endDate.Year-startDate.Year;
if(startDate.Month==endDate.Month&&//如果开始月份和结束月份相同
endDate.Day
简单解决方案:

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);
}
public int getYearDiff(日期时间开始日期,日期时间结束日期){
int y=年(结束日期)-年(开始日期);
int startMonth=月份(起始日期);
int endMonth=月(endDate);
如果(月末<开始月)
返回y-1;
如果(月末>开始月)
返回y;
报税表(日(截止日期)<日(起始日期)?y-1:y;
}

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

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

关于。

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

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;
    }
}
DateTime firstDate=DateTime.Parse(“2019年1月31日”);
DateTime secondDate=DateTime.Parse(“2/1/2016”);
int totalYears=firstDate.Year-secondDate.Year;
int totalMonths=0;
如果(firstDate.Month>secondDate.Month)
totalMonths=firstDate.Month-secondDate.Month;
else if(firstDate.Month
工作完美:

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

以下是基于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;
}
public static int DateDiffYears(DateTime startDate,DateTime endDate)
{
var yr=结束日期。年份-开始日期。年份-1+
(endDate.Month>=startDate.Month&&endDate.Day>=startDate.Day?1:0);
年回报率<0?0:年;
}
处理
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 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;
    }
}
    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 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;
}