我们如何在计划备份的情况下在 C# 中获取下个月日期



我正在尝试创建每月备份设置。因此,如果有人安排了某个特定日期,那么它应该每月在同一天执行。

如果我已将备份安排在 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>时,您才需要这样做。

相关内容

最新更新