我正在尝试创建每月备份设置。因此,如果有人安排了某个特定日期,那么它应该每月在同一天执行。
如果我已将备份安排在 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);
}
在这种情况下,我们可以得到下个月,但我们怎么能得到这一天。
每个月的最后一天执行 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);
获取从原始日期到当前日期的月份,并在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());
您可能会发现使用几个扩展方法(或底层代码(有助于获取任何给定日期时间的最后一天。请注意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>时,您才需要这样做。