Вычитание даты и времени не работает
Я использую следующий код, чтобы вычесть день DateTime
до понедельника
DateTime currentWeek = new DateTime(beginDate.Year, beginDate.Month, beginDate.Day);
while (currentWeek.DayOfWeek.ToString() != "Monday")
{
currentWeek.AddDays(-1);
MessageBox.Show(currentWeek.Day.ToString());
MessageBox.Show(currentWeek.DayOfWeek.ToString());
}
beginDate
при первом запуске устанавливается текущая дата DateTime.Now
,
Для меня это петли навсегда, и день currentWeek
всегда остается тем же самым (29), хотя я вычитаю 1 каждый раз, когда я зацикливаюсь.
Я уже использую другую функцию, которая принимает DateTime
и bool
Параметр, который делает то же самое и работает:
private void ErstenTagDerWocheAuswaehlen(DateTime date, bool anfangDerWoche = true)
{
string wochentagName;
int incrementor;
if(anfangDerWoche == true)
{
wochentagName = "Monday";
incrementor = -1;
}
else
{
wochentagName = "Friday";
incrementor = 1;
}
while(date.DayOfWeek.ToString() != wochentagName)
{
date = date.AddDays(incrementor);
}
}
Может кто-нибудь объяснить мне, почему верхний код не работает, а нижний работает?
3 ответа
Вы должны назначить результирующее значение, DateTime является неизменным.
currentWeek = currentWeek.AddDays(-1);
О вашем втором вопросе:
- Используйте перечисление для дня недели, не пытайтесь преобразовать день недели в строку для сравнения. Тип является
DayOfWeek
, - Опять
DateTime
не является изменчивым, поэтому вы должны вернутьDateTime
экземпляр, так как вы не можете изменить тот, который был передан (без передачи какref
)
Изменение кода
private DateTime ErstenTagDerWocheAuswaehlen(DateTime date, bool anfangDerWoche = true)
{
System.DayOfWeek wochentagName;
int incrementor;
if(anfangDerWoche == true)
{
wochentagName = System.DayOfWeek.Monday;
incrementor = -1;
}
else
{
wochentagName = System.DayOfWeek.Friday;
incrementor = 1;
}
while(date.DayOfWeek != wochentagName)
{
date = date.AddDays(incrementor);
}
return date;
}
DateTime
является неизменной структурой, поэтому вам нужно сохранить значение, возвращаемое из AddDays()
:
var t2 = currentWeek.AddDays(-1);
Тогда используйте t2
, Призыв к AddDays()
на самом деле не меняется currentWeek
,
Как DateTime
является неизменным, при использовании AddDays
он возвращает новый DateTime
структура с новой информацией и не меняет данную. Документация метода гласит:
Возвращает новый System.DateTime, который добавляет указанное количество дней к значению этого экземпляра.
Вы должны присвоить его переменной:
currentWeek = currentWeek.AddDays(-1);