将Date更新为指定月份

  • 本文关键字:Date 更新 c# datetime
  • 更新时间 :
  • 英文 :


在我的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);
}

最新更新