簡體   English   中英

我們如何在計划備份的情況下在C#中獲得下個月的日期

[英]How can we get next month date in C# in scheduled backup case

我正在嘗試創建每月備份設置。 因此,如果有人安排某個特定日期,那么它應該在同一天按月執行。

如果我在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);
}

在這種情況下,我們可以在下個月獲得,但我們怎樣才能得到這一天。

獲取從原始日期到當前日期的AddMonths() ,並在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());

您可能會發現使用幾個擴展方法(或底層代碼)有助於獲取任何給定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,你只需要這樣做。

你可以在每個月的最后一天執行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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM