关于c#:将日期更新为特定月份

Update a Date to a specific month

在我的MVC应用程序中,我的用户说他们一年做两次笔试。三月和九月。但是,如果一个用户没有通过测试,那么他们将在90天内重新测试(不必是3月或9月)。

例如,如果一个用户在3/2/2016上进行了第一次测试,并且该用户通过了测试,那么该用户直到9月的任何一天才需要进行另一次测试。但如果该用户失败,则该用户需要在5月31日重新进行测试。所以让我试着用一点代码来说明这一点。

1
2
3
4
5
6
7
8
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月?

我创造了一个网络小提琴

感谢您的帮助。

更新

如果他们失败了一次又失败了,那么他们每90天就要重新夺回一次。如果他们在九月份之后继续不及格,他们就跳过九月份,如果他们通过了,就再去三月份。


要简化逻辑,请考虑以下内容。

当有人通过测试时,我们不需要关心最后一个测试日期;我们可以根据当前日期为下一个可用的测试安排时间。下面的代码表示您只能在前一个月预订该测试

如果失败,则在最后一次测试日期后增加90天。

1
2
3
4
5
6
7
8
9
10
11
12
13
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
2
3
4
5
6
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);

您没有指定3月和9月的日期应该是哪个月的哪一天,所以我随意选择了第一个。


我想这能抓住你想要的。我将下一个测试日期设置为9月/3月的最后一天,尽管您可以根据自己的需求轻松地更改它。

1
2
3
4
5
6
7
8
9
10
11
12
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);
}