Получить последнюю/следующую неделю в среду С#

Как я получу на прошлой неделе среду и следующую неделю в среду на С#:

public Form1()
{
   InitializeComponent();
   CurrentDate.Text = "Today Date: " + DateTime.Now.ToString("dd/MM/yyyy");
   CurrentRent.Text = "Current Rent Date: "; // last wednesday
   NextRent.Text = "Next Rent Date: "; // next wednesday
}

Ответ 1

Чтобы найти следующую среду, просто добавляйте дни, пока не найдете ее. Чтобы найти предыдущую среду, просто продолжайте вычитать дни, пока не дойдете до одного.

DateTime nextWednesday = DateTime.Now.AddDays(1);
while (nextWednesday.DayOfWeek != DayOfWeek.Wednesday)
    nextWednesday = nextWednesday.AddDays(1);
DateTime lastWednesday = DateTime.Now.AddDays(-1);
while (lastWednesday.DayOfWeek != DayOfWeek.Wednesday)
    lastWednesday = lastWednesday.AddDays(-1);

Ответ 2

DateTime.Now.AddDays(7) и DateTime.Now.AddDays(-7) - это то, как вы можете делать арифметику, предполагая, что вы в среду. Если вы этого не сделаете, вам нужно будет использовать свойство DayOfWeek, чтобы определить количество дней (положительное и отрицательное), которое вам нужно будет определить, какой день "среда". Затем вы можете передать это значение в AddDays.

Например, если сегодня был вторник, вы бы AddDays(-6) в прошлую среду и AddDays(8) в следующую среду.

Я оставлю вам задачу их вычисления.

Ответ 3

Используйте процедуру AddDays:

        // increment by the number of offset days to get the correct date
        DayOfWeek desiredDay = DayOfWeek.Wednesday;
        int offsetAmount = (int) desiredDay - (int) DateTime.Now.DayOfWeek;
        DateTime lastWeekWednesday = DateTime.Now.AddDays(-7 + offsetAmount);
        DateTime nextWeekWednesday = DateTime.Now.AddDays(7 + offsetAmount);

Это должно сделать это!

ПРИМЕЧАНИЕ. Если это понедельник, "в прошлую среду" выйдет в прошлую среду, но "В следующую среду" вы дадите вам среду через 9 дней! Если вы хотите получить среду через два дня, вам нужно будет использовать оператор "%". Это означает, что второй оператор "nextweek" будет читать "(7 + offsetAmount)% 7".

Ответ 4

Вы можете использовать это для расчета:

DateTime day = DateTime.Today;
while (day.DayOfWeek != DayOfWeek.Wednesday)
    day = day.AddDays(-1);
var currentRent = day;
var nextRent = day.AddDays(7);

Обратите внимание, что если сегодня среда, это покажет currentRent, как сегодня, а не nextRent как сегодня. Если вы хотите, чтобы это было отменено, вы можете отменить логику.

DateTime day = DateTime.Today;
while (day.DayOfWeek != DayOfWeek.Wednesday)
    day = day.AddDays(1);
var currentRent = day.AddDays(-7);
var nextRent = day;

Ответ 5

Вы хотите использовать перечисление DayOfWeek вместе с структурой if-else оператора switch, чтобы определить, сколько дней нужно добавлять/вычитать для ваших дат. Это утомительная кодировка, но простая.

DateTime nextRent;
DateTime lastRent;
DateTime today = DateTime.Now;

if (today.DayOfWeek == DayOfWeek.Wednesday)
{
   nextRent = today.AddDays(7);
   lastRent = today.AddDays(-7);
}
else if (today.DayOfWeek == DayOfWeek.Thursday)
{
   nextRent = today.AddDays(6);
   lastRent = today.AddDays(-8);
}
//ect for all days

Ответ 6

Это сработает. Вам нужно рассчитать разницу в днях между предоставленной датой и ближайшей средой и рассчитать последнюю/следующую среду в зависимости от того, больше или нет разница больше нуля.

int difference = date.DayOfWeek - DayOfWeek.Wednesday;
DateTime lastWednesday = difference > 0 ? date.AddDays(-1 * difference) : date.AddDays(-1 * (7 + difference));
DateTime nextWednesday = lastWednesday.AddDays(7);

Ответ 7

Улучшенный ответ от Servy. Вам нужно установить даты nextWednesday или lastWednesday в новую дату в цикле while, иначе она переходит в бесконечный цикл

DateTime nextWednesday = DateTime.Now.AddDays(1);
while (nextWednesday.DayOfWeek != DayOfWeek.Wednesday)
    nextWednesday = nextWednesday.AddDays(1);
DateTime lastWednesday = DateTime.Now.AddDays(-1);
while (lastWednesday.DayOfWeek != DayOfWeek.Wednesday)
    lastWelastWednesday.AddDays(-1);

Ответ 8

Вы можете создать 2 метода расширения DateTime, которые можно использовать с параметром DayOfWeek:

public static class DateTimeExtension
{
    public static DateTime GetPreviousWeekDay(this DateTime currentDate, DayOfWeek dow)
    {
        int currentDay = (int)currentDate.DayOfWeek, gotoDay = (int)dow;
        return currentDate.AddDays(-7).AddDays(gotoDay-currentDay);
    }

    public static DateTime GetNextWeekDay(this DateTime currentDate, DayOfWeek dow)
    {
        int currentDay = (int)currentDate.DayOfWeek, gotoDay = (int)dow;
        return currentDate.AddDays(7).AddDays(gotoDay - currentDay);
    }
}

который затем можно использовать следующим образом:

DateTime testDate = new DateTime(2017, 01, 21);

Console.WriteLine(testDate.GetPreviousWeekDay(DayOfWeek.Wednesday));
Console.WriteLine(testDate.GetNextWeekDay(DayOfWeek.Wednesday));

Ответ 9

    private static DateTime FindPreviousDayOfWeek(DateTime fromDate, DayOfWeek findDay, 
        bool skipSame = false)
    {
        if (fromDate.DayOfWeek < findDay)
            fromDate = fromDate.AddDays(-((int)fromDate.DayOfWeek - 1 + (int)findDay));
        else if (fromDate.DayOfWeek > findDay)
            fromDate = fromDate.AddDays(-((int)fromDate.DayOfWeek - (int)findDay));
        else if (fromDate.DayOfWeek == findDay && skipSame == true)
            fromDate = fromDate.AddDays(-7);

        return fromDate;
    }

переменная skipSame не включает текущий день, если это saem как желаемый день.