.net(C#)获取两个日期间隔的年月日

年份:不满一年,算0年
月份:当前月,1号到月底算1月,2号到次月1号,3号到次月2号,依次类推,算1个月
天数:包含起止日期的天数

        /// <summary>
        /// 
        /// </summary>
        /// <param name="MinDate"></param>
        /// <param name="MaxDate"></param>
        /// <returns></returns>
        private static GetDiffDateModel GetDiffDate(DateTime MinDate, DateTime MaxDate)
        {
            GetDiffDateModel result = new GetDiffDateModel();

            //只比较年月日
            MinDate = new DateTime(MinDate.Year, MinDate.Month, MinDate.Day);
            MaxDate = new DateTime(MaxDate.Year, MaxDate.Month, MaxDate.Day);

            if (MinDate >= MaxDate)
            {
                return result;
            }

            #region 年
            #region 案例
            /*
            #2022.01.01  2022.12.29 2022.12.31 0
            #2022.01.01  2022.12.30 2022.12.31 0
            #2022.01.01  2022.12.31 2022.12.31 1
            #2022.01.01  2023.12.29 2023.12.31 1
            #2022.01.01  2023.12.30 2023.12.31 1
            #2022.01.01  2023.12.31 2023.12.31 2
            #2022.01.02  2022.12.29 2023.01.01 0
            #2022.01.02  2022.12.30 2023.01.01 0
            #2022.01.02  2022.12.31 2023.01.01 0
            #2022.01.03  2023.01.01 2023.01.02 0
            #2022.01.03  2023.01.02 2023.01.02 1
            #2022.01.03  2023.12.31 2023.01.02 1
            #2022.01.03  2024.01.01 2024.01.02 2
             */
            #endregion
            var _year = MaxDate.Year - MinDate.Year;
            if (MinDate.Month == 1 && MinDate.Day == 1)
            {
                //如果是当前最后一天,年份+1
                if (MaxDate == new DateTime(MaxDate.Year, 12, 31))
                {
                    _year++;
                }
            }
            else
            {
                if (_year == 0)//同一年
                {
                    _year = 0;
                }
                else
                {
                    if (MinDate.AddYears(_year).AddDays(-1) > MaxDate)
                    {
                        _year--;
                    }
                }
            }
            result.Year = _year;
            #endregion

            #region 月
            #region 案例
            /*
            2022年8月1号~2022年08月30号 2022年08月31号 算0月
            2022年8月1号~2022年08月31号 2022年08月31号 算1月
            2022年8月3号~2022年09月01号 2022年09月02号 算0月
            2022年8月3号~2022年09月02号 2022年09月02号 算1月
            2022年8月3号~2022年09月30号 2022年09月02号 算1月
            2022年8月3号~2022年09月31号 2022年09月02号 算1月
            2022年8月3号~2022年10月01号 2022年10月02号 算1月
            2022年8月3号~2022年10月02号 2022年10月02号 算2月
            */
            #endregion
            /*
             逻辑:先把年的部分去掉,然后比较剩下的月份
             */
            var currMinDate = MinDate.AddYears(result.Year);
            var _month = MaxDate.Month - currMinDate.Month;
            if (currMinDate.Day == 1)
            {
                //如果是当月最后一天,月份+1
                if (MaxDate.Day == new DateTime(MaxDate.Year, MaxDate.Month, 1).AddMonths(1).AddDays(-1).Day)
                {
                    _month++;
                }
            }
            else
            {
                if (_month == 0)//同一月
                {
                    _month = 0;
                }
                else
                {
                    if (currMinDate.AddMonths(_month).AddDays(-1) > MaxDate)
                    {
                        _month--;
                    }
                }
            }
            result.Month = _month + (result.Year * 12);

            #endregion

            #region 日
            result.Day = (MaxDate.Date - MinDate.Date).Days + 1;
            #endregion

            return result;
        }

        public class GetDiffDateModel
        {
            public int Year { get; set; }
            public int Month { get; set; }
            public int Day { get; set; }
        }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值