我正在尝试创建每月备份设置。因此,如果某人安排了某个特定日期,那么它应该在同一日期每月执行一次。
如果我计划在2018年12月31日进行备份,则希望在每月的同一日期执行备份。 1月将获得31,它将执行,但2月我们能做什么,它抛出异常,因为本月不存在31。 接下来的几个月我们还能做什么?我们如何获得下一个备份日期?
我尝试使用DateTime.Day属性先获取计划的备份日期,然后获取该月的当前日期,并比较当前日期是否大于已计划的日期,然后在当日添加一个月这将是下一个备份月,否则下一个备份将在当月进行。
DateTime scheduledDate = new DateTime(2019,1,31);
DateTime currentDate = DateTime.Now;
NextBackupdate = currentDate;
int scDay = scheduledDate.Day;
int cDay = currentDate.Day;
if(cDay > scDay)
{
NextBackupdate = NextBackupdate.AddMonths(1);
}
在这种情况下,我们可以得到下个月,但是我们如何得到一天。
答案 0 :(得分:0)
获取从原始日期到当前日期的月份,并将其用于AddMonths()
DateTime scheduledDate = new DateTime(2019, 1, 31);
int months = ((DateTime.Now.Year - scheduledDate.Year) * 12) + DateTime.Now.Month - scheduledDate.Month;
DateTime nextbackupDate = scheduledDate.AddMonths(months);
Console.WriteLine(nextbackupDate.ToString());
答案 1 :(得分:0)
您可能会发现使用几种扩展方法(或基础代码)有助于获取给定DateTime的最后一天。注意DaysInMonth
方法:
/// <summary>
/// Get last day of month based on date
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static DateTime LastDayOfMonth(this DateTime value)
{
return new DateTime(value.Year, value.Month, DateTime.DaysInMonth(value.Year, value.Month));
}
/// <summary>
/// Get the first day of month based on date
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static DateTime FirstDayOfMonth(this DateTime value)
{
return new DateTime(value.Year, value.Month, 1);
}
因此,如果要获取下一个月的最后一天,您可以简单地写
NextBackupdate.FirstDayOfMonth().AddMonths(1).LastDayOfMonth();
请确保您只有在工作日> 28时才这样做。
答案 2 :(得分:0)
您可以在每个月的最后一天执行bukcup,我认为这更有意义,因为在2月您将遇到29、30和31的问题。
看一个例子,获取当前月份的最后一天
var actualMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
var nextMonth = actualMonth.AddMonths(1);
var lastDayOfMonth = nextMonth.AddDays(-1);