#c# #datetime
#c# #дата и время
Вопрос:
В моем приложении MVC мои пользователи сказали, что они выполняют письменные тесты 2 раза в год .. в марте и сентябре. Однако, если пользователь не прошел тест, он повторно проходит тестирование через 90 дней (не обязательно в марте или сентябре).
Например, если пользователь проходит свой самый первый тест 3/2/2016
, и этот пользователь проходит, то этому пользователю не нужно проходить другой тест до любого дня в сентябре. Но если этот пользователь потерпит неудачу, то ему необходимо пересдать тест 31 мая. Итак, позвольте мне попытаться проиллюстрировать это небольшим фрагментом кода.
DateTime usersTestDate = new DateTime(2016, 3, 2);
// user fails
usersTestDate = usersTestDate.AddDays(90);
// usersTestDate is now 5/31/2016
// now the user retakes the test and passes
// usersTestDate should now be in September of 2016.
Как мне добиться этого, поскольку usersTestDate по сути может быть любой датой в книге, если пользователь потерпит неудачу.. В принципе, если пользователь сдает повторную сдачу экзамена в любые месяцы, кроме марта или сентября.. как мне получить их новую дату в марте или сентябре?
Я создал dotnetfiddle
Любая помощь приветствуется.
Обновить
Если они снова выходят из строя после того, как уже один раз потерпели неудачу, они продолжают повторять каждые 90 дней. Если они продолжают проваливать свой мартовский тест после сентября, они пропускают сентябрь и просто переходят к марту снова, если они проходят
Комментарии:
1. что происходит, когда они выходят из строя во второй раз? Они повторяют попытку? Что происходит, когда они продолжают проваливать свой мартовский тест после сентября?
2. @Jonesopolis извините, я этого не добавил. если они снова выходят из строя после того, как уже один раз потерпели неудачу, они продолжают повторять каждые 90 дней. Если они продолжают проваливать свой мартовский тест после сентября, они пропускают сентябрь и просто переходят к марту снова, если они проходят
3. Похоже, у вас есть неплохое представление о требованиях, вы просто не понимаете, как перевести этот английский в код?
4. Итак, посмотрите на месяц текущего теста и работайте дальше. Если текущий прошедший месяц равен маю, увеличьте его до сентября, в противном случае увеличьте его до марта. (т.Е. Студент проходит 31/5/2016 5 больше 3, поэтому месяц должен быть 9. Однако, если учащийся сдает экзамен 15.11.2016, вам нужно будет установить месяц на 3 (март) и увеличить год, потому что они заканчиваются через оба месяца, а следующий тестовый месяц выпадает на следующий год.
5. @Jonesopolis ха-ха, это правильно.
Ответ №1:
if (userTestDate.Month < 3)
userTestDate = new DateTime(userTestDate.Year, 3, 1);
else if (userTestDate.Month < 9)
userTestDate = new DateTime(userTestDate.Year, 9, 1);
else
userTestDate = new DateTime(userTestDate.Year 1, 3, 1);
Вы не указываете, в какой день месяца должны быть даты марта и сентября, поэтому я произвольно выбрал первое.
Комментарии:
1. Спасибо за помощь! Я определенно сделал это намного сложнее, чем это должно было быть!
Ответ №2:
Я думаю, это отражает то, что вам нужно. Я установил следующую дату тестирования на последний день сентября / марта, хотя вы можете легко изменить это в зависимости от ваших требований.
public DateTime GetNextTestDate(DateTime testDate, bool passed)
{
if (passed)
{
if (testDate.Month >= 3 amp;amp; testDate.Month < 9)
return new DateTime(testDate.Year, 9, 30);
else
return new DateTime(testDate.Year (testDate.Month >= 9 amp;amp; testDate.Month <= 12 ? 1 : 0), 3, 31); // (add a year if we're 9-12)
}
else
return testDate.AddDays(90);
}
Комментарии:
1. Спасибо за помощь! Я определенно сделал это намного сложнее, чем это должно было быть!
Ответ №3:
Для упрощения логики рассмотрим следующее.
Когда кто-то проходит, нам не нужно заботиться о дате последнего теста; мы можем просто запланировать их для следующего доступного теста, исходя из текущей даты. В приведенном ниже коде говорится, что вы можете записаться на этот тест только за месяц до этого
Если они завершаются неудачей, добавьте 90 дней к последней дате тестирования.
public DateTime NextTestDate(DateTime testDate, bool passed)
{
if (passed)
{
var now = DateTime.Now;
if (DateTime.Now.Month < 3)
return new DateTime(now.Year, 3, 2);
if (DateTime.Now.Month < 9)
return new DateTime(now.Year, 9, 2);
return new DateTime(now.Year 1, 3, 2);
}
return testDate.AddDays(90);
}
Комментарии:
1. Спасибо за помощь! Я определенно сделал это намного сложнее, чем это должно было быть!