将日期更新为特定月份

时间:2016-09-29 19:20:05

标签: c# datetime

在我的MVC应用程序中,我的用户说他们每年做2次书面测试..在3月和9月。但是,如果用户未通过测试,则他们会在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天就会重新开始。如果他们在3月份的测试中继续失败,那么他们将在9月份之前跳过,如果他们通过了,那么他们将再次进入3月份

3 个答案:

答案 0 :(得分:1)

我认为这可以捕捉到你所追求的东西。我将下一个考试日期设置为9月/ 3月的最后一天,尽管您可以根据自己的要求轻松更改。

import pandas as pd
dftest = pd.DataFrame({'A':[1,1,1,1,1,1,1,1,1,2,2,2,2,2], 
               'Amt':[20,20,20,30,30,30,30,40, 40,10, 10, 40,40,40]})

print(dftest)

答案 1 :(得分: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);

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

答案 2 :(得分:1)

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

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

如果失败,则在最后一个测试日期添加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);
}