c#日期(datetime)增减计算针对月底的处理方法

本方法欲达成的目的:
日期月底加减N年或N月后的目标日期仍然是月底

扩展函数

public static class DateTimeExt
    {
        /// <summary>
        /// 日期加减年份,针对月底特殊处理
        /// </summary>
        /// <param name="dateTime"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static DateTime AddYearsExt(this DateTime dateTime, int value)
        {
            var next = dateTime.AddYears(value);
            //如果当前日期是月底,加减N年后,目标日期依然设为最后一天
            if (dateTime.Day == DateTime.DaysInMonth(dateTime.Year, dateTime.Month))
            {
                next = new DateTime(next.Year, next.Month, DateTime.DaysInMonth(next.Year, next.Month));
            }
            return next;
        }
        /// <summary>
        /// 日期加减月份 ,针对月底特殊处理
        /// </summary>
        /// <param name="dateTime"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static DateTime AddMonthsExt(this DateTime dateTime, int value)
        {
            var next = dateTime.AddMonths(value);
            //如果当前日期是月底,加减N年后,目标日期依然设为最后一天
            if (dateTime.Day == DateTime.DaysInMonth(dateTime.Year, dateTime.Month))
            {
                next = new DateTime(next.Year, next.Month, DateTime.DaysInMonth(next.Year, next.Month));
            }
            return next;
        }
    }

测试

class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("日期加减测试,输入日期 部位 数字");
                var str = Console.ReadLine();
                if (string.IsNullOrWhiteSpace(str))
                {
                    break;
                }
                var sps = str.Split(" ");
                var dt = DateTime.Parse(sps[0]);
                var part = sps[1];
                var value = int.Parse(sps[2]);
                switch (part)
                {
                    case "year":
                        dt = dt.AddYearsExt(value);
                        break;
                    case "mon":
                        dt = dt.AddMonthsExt(value);
                        break;
                }
                Console.WriteLine($"结果:{dt:yyyy-MM-dd}");
            }
        }
    }

结果预览
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值