将Date更新为指定月份
本文关键字:Date 更新 | 更新日期: 2023-09-27 18:09:29
在我的MVC应用程序中,我的用户说他们每年进行2次书面测试。三月和九月。然而,如果用户未能通过测试,他们将在90天后重新测试(不一定是3月或9月)。
例如,如果用户在3/2/2016
上进行了的第一次测试,并且该用户通过了,那么该用户直到9月的任何一天都不需要进行其他测试。但如果该用户失败了,那么该用户需要在5月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本质上可以是书中的任何日期如果用户失败…基本上,如果用户在3月或9月以外的任何一个月通过了重考……我怎样才能把他们的新约会日期定在3月或9月?
我已经创建了一个dotnetfiddle
任何帮助都是感激的。
如果他们在一次失败后再次失败,那么他们将每90天重新尝试一次。如果他们在9月之后的3月考试中一直不及格,那么如果他们通过了考试,他们就会跳过9月的考试,然后再参加3月的考试
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);
你没有指定三月的哪一天&9月的日期应该是,所以我随意选择了第一个。
我认为这抓住了你想要的。我将下一次测试日期设置为9月/3月的最后一天,尽管您可以根据您的需求轻松更改。
public DateTime GetNextTestDate(DateTime testDate, bool passed)
{
if (passed)
{
if (testDate.Month >= 3 && testDate.Month < 9)
return new DateTime(testDate.Year, 9, 30);
else
return new DateTime(testDate.Year + (testDate.Month >= 9 && testDate.Month <= 12 ? 1 : 0), 3, 31); // (add a year if we're 9-12)
}
else
return testDate.AddDays(90);
}
为了简化逻辑,请考虑以下问题:
当有人通过时,我们不需要关心最后一次考试的日期;我们可以根据当前日期安排他们参加下一个可用的测试。下面的代码表明您只能预订
前一个月的测试如果失败,则在最后一次测试日期后增加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);
}