在我的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月份
答案 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);
}