Получить последнюю/следующую неделю в среду С#
Как я получу на прошлой неделе среду и следующую неделю в среду на С#:
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 как желаемый день.