本方法欲达成的目的:
日期月底加减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}");
}
}
}
结果预览