我对我的代码非常满意,但还有一个问题。
我有这个代码(简短版):
if (holidays.Contains(eskalation.Value.Date))
{
eskalationsZeit = new DateTime(eskalation.Value.Year, eskalation.Value.Month, eskalation.Value.Day + 1, 8, 0, 0);
if (eskalation.Value.Day == DateTime.DaysInMonth(eskalation.Value.Year, eskalation.Value.Month))
{
eskalation = new DateTime(eskalation.Value.Year, eskalation.Value.Month + 1, 1, 8, 0, 0);
if (eskalation.Value.DayOfWeek == DayOfWeek.Saturday)
{
eskalation = new DateTime(eskalation.Value.Year, eskalation.Value.Month + 1, 3, 8, 0, 0);
}
else if (eskalation.Value.DayOfWeek == DayOfWeek.Sunday)
{
eskalation = new DateTime(eskalation.Value.Year, eskalation.Value.Month + 1, 2, 8, 0, 0);
}
}
}
在本规范中,我要问的是节假日(列表),星期六或星期日,如果是月份的最后一天,那么我必须更改月份。 一切都很好但是 -
如果我有30天的一个月的第28个,这是一个假期,我将增加1天,所以我是第29个。现在29日是星期六,所以我将再添加2天,但此时我得到了我的例外,因为我添加了这样的日子:
if (eskalation.Value.DayOfWeek == DayOfWeek.Saturday)
{
eskalation = new DateTime(eskalation.Value.Year, eskalation.Value.Month, eskalation.Value.Day + 2, 8, 0, 0);
}
结果将是一个月的第31天,只有30天。
如何在一个月内添加天数?喜欢 - 如果添加Days的结果大于每月的天数 - 请选择下个月的第一个(第二个,第三个或其他什么)?!是否有方法或快速解决方案?
感谢您的帮助。
欢呼戴夫答案 0 :(得分:3)
如果您使用AddDays()
方法,它会在发生溢出时自动为您处理月份和年份的更改...
eskalation = eskalation.AddDays(numOfDays);
考虑到这一点,我相信以下代码将满足您的需求:
// Keep looping until we find a date that we like
while(true)
{
if(holidays.Contains(eskalation.Value.Date))
eskalation = eskalation.AddDays(1);
else if(eskalation.Value.DayOfWeek == DayOfWeek.Saturday)
eskalation = eskalation.AddDays(2);
else if(eskalation.Value.DayOfWeek == DayOfWeek.Sunday)
eskalation = eskalation.AddDays(1);
else
break;
}
注意:您可以使用括号整理代码,并根据需要改进逻辑。我只想保持简短,以便更容易理解正在发生的事情
答案 1 :(得分:2)
答案 2 :(得分:1)
为什么不简单
// isFreeDay can check for weekends, holidays, ...
while (isFreeDay(eskalation.Value.Date))
{
eskalation = eskalation.Value.AddDays(1);
}
答案 3 :(得分:1)
而不是这样做:
if (eskalation.Value.DayOfWeek == DayOfWeek.Saturday)
{
eskalation = new DateTime(eskalation.Value.Year, eskalation.Value.Month, eskalation.Value.Day + 2, 8, 0, 0);
}
这样做:
while (eskalation.Value.DayOfWeek == DayOfWeek.Saturday || eskalation.Value.DayOfWeek == DayOfWeek.Sunday)
{
eskalation = eskalation.AddDays(1) ;
}