Вычитание даты и времени не работает

Я использую следующий код, чтобы вычесть день 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);

О вашем втором вопросе:

  1. Используйте перечисление для дня недели, не пытайтесь преобразовать день недели в строку для сравнения. Тип является DayOfWeek,
  2. Опять 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);
Другие вопросы по тегам