C#:从开始日期开始添加工作日
我做这件事有困难。我正在创建一个在特定日期添加工作日的方法。 例如,我想将3个工作日添加到2010年9月15日(星期三),该方法将返回9月20日(下周星期一)。它不考虑周六和周日,因为这是非工作日 C#中的类似内容:C#:从开始日期开始添加工作日,c#,algorithm,datetime,C#,Algorithm,Datetime,我做这件事有困难。我正在创建一个在特定日期添加工作日的方法。 例如,我想将3个工作日添加到2010年9月15日(星期三),该方法将返回9月20日(下周星期一)。它不考虑周六和周日,因为这是非工作日 C#中的类似内容: 我不考虑特殊假日的计算,我只是想添加除星期六和星期天以外的日子。提前感谢!=)0) { //星期六着陆加上两天 结束=结束。添加天数(2); } else if(end.DayOfWeek
我不考虑特殊假日的计算,我只是想添加除星期六和星期天以外的日子。提前感谢!=)如果你不需要考虑假期,我建议你做这样的事情:
public static DateTime AddWorkingDays(DateTime specificDate,
int workingDaysToAdd)
{
int completeWeeks = workingDaysToAdd / 5;
DateTime date = specificDate.AddDays(completeWeeks * 7);
workingDaysToAdd = workingDaysToAdd % 5;
for (int i = 0; i < workingDaysToAdd; i++)
{
date = date.AddDays(1);
while (!IsWeekDay(date))
{
date = date.AddDays(1);
}
}
return date;
}
private static bool IsWeekDay(DateTime date)
{
DayOfWeek day = date.DayOfWeek;
return day != DayOfWeek.Saturday && day != DayOfWeek.Sunday;
}
public static DateTime AddWorkingDays(DateTime specific date,
int workingDaysToAdd)
{
int completeWeeks=要添加的工作日/5;
DateTime日期=具体日期。添加天数(完成周*7);
workingDaysToAdd=workingDaysToAdd%5;
对于(int i=0;i
它效率低下,但容易理解。对于一个高效的版本,您可以像以前一样计算出要添加的完整周数,但是可以从任何“当前工作日”和“剩余添加工作日”到“实际添加天数”进行映射。然后你就可以计算出需要增加的总天数,并在一次通话中完成
编辑:就效率低下的程度而言。。。这真的不是很糟糕。它将只执行长达4天的手动“这是一个周末”检查,这还不错。特别是,尽管igor(在发布时是最新的)声称,它比他的方法快得多,尽管基准有缺陷;)
请注意,它可能还不能处理负输入-我还没有检查
我使用这种方法背后的一个原因是,它既不依赖于我,也不依赖于代码读取器知道DayOfWeek
enum中的值是什么。我不在乎是0-6,1-7,周一周日,周六周五。。。或者即使有完全奇怪的价值观。我只比较等式,这使代码更“明显正确”。以下是您需要的:
更新:
public static DateTime AddWeekdays(DateTime start, int days)
{
int remainder = days % 5;
int weekendDays = (days / 5) * 2;
DateTime end = start.AddDays(remainder);
if (start.DayOfWeek == DayOfWeek.Saturday && days > 0)
{
// fix for saturday.
end = end.AddDays(-1);
}
if (end.DayOfWeek == DayOfWeek.Saturday && days > 0)
{
// add two days for landing on saturday
end = end.AddDays(2);
}
else if (end.DayOfWeek < start.DayOfWeek)
{
// add two days for rounding the weekend
end = end.AddDays(2);
}
// add the remaining days
return end.AddDays(days + weekendDays - remainder);
}
class Program
{
public static DateTime AddWorkingDays(DateTime specificDate,
int workingDaysToAdd)
{
int completeWeeks = workingDaysToAdd / 5;
DateTime date = specificDate.AddDays(completeWeeks * 7);
workingDaysToAdd = workingDaysToAdd % 5;
for (int i = 0; i < workingDaysToAdd; i++)
{
date = date.AddDays(1);
while (!IsWeekDay(date))
{
date = date.AddDays(1);
}
}
return date;
}
private static bool IsWeekDay(DateTime date)
{
DayOfWeek day = date.DayOfWeek;
return day != DayOfWeek.Saturday && day != DayOfWeek.Sunday;
}
public static DateTime MyAddWorkingDays(DateTime specificDate,
int workingDaysToAdd)
{
int foundWorkingDays = 0;
while (foundWorkingDays < workingDaysToAdd)
{
specificDate = specificDate.AddDays(1);
if (specificDate.DayOfWeek != DayOfWeek.Sunday && specificDate.DayOfWeek != DayOfWeek.Saturday)
foundWorkingDays++;
}
return specificDate;
}
static void Main(string[] args)
{
DateTime specificDate = DateTime.Now;
Stopwatch globalTimer = Stopwatch.StartNew();
Console.WriteLine(AddWorkingDays(specificDate, 300)); // 100000 :)
globalTimer.Stop();
Console.WriteLine(globalTimer.ElapsedMilliseconds);
globalTimer = Stopwatch.StartNew();
Console.WriteLine(MyAddWorkingDays(specificDate, 300)); // 100000 :)
globalTimer.Stop();
Console.WriteLine(globalTimer.ElapsedMilliseconds);
Console.ReadLine();
}
}
publicstaticdatetime AddWeekdays(DateTime开始,int天)
{
整数剩余=天数%5;
国际周日=(天/5)*2;
DateTime end=start.AddDays(剩余);
如果(start.DayOfWeek==DayOfWeek.Saturday&&days>0)
{
//定在星期六。
结束=结束添加天数(-1);
}
如果(end.DayOfWeek==DayOfWeek.Saturday&&days>0)
{
//星期六着陆加上两天
结束=结束。添加天数(2);
}
else if(end.DayOfWeek
int foundWorkingDays=0;
while(查找工作日<工作日添加)
{
specificDate=specificDate.AddDays(1);
如果(specificDate.DayOfWeek!=DayOfWeek.Sunday和&specificDate.DayOfWeek!=DayOfWeek.周六)
foundWorkingDays++;
}
返回日期;
添加:
public static DateTime AddWeekdays(DateTime start, int days)
{
int remainder = days % 5;
int weekendDays = (days / 5) * 2;
DateTime end = start.AddDays(remainder);
if (start.DayOfWeek == DayOfWeek.Saturday && days > 0)
{
// fix for saturday.
end = end.AddDays(-1);
}
if (end.DayOfWeek == DayOfWeek.Saturday && days > 0)
{
// add two days for landing on saturday
end = end.AddDays(2);
}
else if (end.DayOfWeek < start.DayOfWeek)
{
// add two days for rounding the weekend
end = end.AddDays(2);
}
// add the remaining days
return end.AddDays(days + weekendDays - remainder);
}
class Program
{
public static DateTime AddWorkingDays(DateTime specificDate,
int workingDaysToAdd)
{
int completeWeeks = workingDaysToAdd / 5;
DateTime date = specificDate.AddDays(completeWeeks * 7);
workingDaysToAdd = workingDaysToAdd % 5;
for (int i = 0; i < workingDaysToAdd; i++)
{
date = date.AddDays(1);
while (!IsWeekDay(date))
{
date = date.AddDays(1);
}
}
return date;
}
private static bool IsWeekDay(DateTime date)
{
DayOfWeek day = date.DayOfWeek;
return day != DayOfWeek.Saturday && day != DayOfWeek.Sunday;
}
public static DateTime MyAddWorkingDays(DateTime specificDate,
int workingDaysToAdd)
{
int foundWorkingDays = 0;
while (foundWorkingDays < workingDaysToAdd)
{
specificDate = specificDate.AddDays(1);
if (specificDate.DayOfWeek != DayOfWeek.Sunday && specificDate.DayOfWeek != DayOfWeek.Saturday)
foundWorkingDays++;
}
return specificDate;
}
static void Main(string[] args)
{
DateTime specificDate = DateTime.Now;
Stopwatch globalTimer = Stopwatch.StartNew();
Console.WriteLine(AddWorkingDays(specificDate, 300)); // 100000 :)
globalTimer.Stop();
Console.WriteLine(globalTimer.ElapsedMilliseconds);
globalTimer = Stopwatch.StartNew();
Console.WriteLine(MyAddWorkingDays(specificDate, 300)); // 100000 :)
globalTimer.Stop();
Console.WriteLine(globalTimer.ElapsedMilliseconds);
Console.ReadLine();
}
}
类程序
{
公共静态日期时间添加工作日(日期时间指定日期,
int workingDaysToAdd)
{
int completeWeeks=要添加的工作日/5;
DateTime日期=具体日期。添加天数(完成周*7);
workingDaysToAdd=workingDaysToAdd%5;
对于(int i=0;i
一种很酷的方式(我认为)是将其放在扩展方法中,如:
public static class DateTimeExtensions
{
public static DateTime AddWorkingDays(this DateTime self, int days)
{
self = self.AddDays(days);
while (self.DayOfWeek == DayOfWeek.Saturday || self.DayOfWeek == DayOfWeek.Sunday)
{
self = self.AddDays(1);
}
return self;
}
}
因此,您的最终代码如下所示:
specificDate.AddWorkingDays(3);
这是一个老帖子,但有人可能对处理负面日子的扩展感兴趣。(我已经修改了@Jon answer)
publicstaticdatetime AddWeekDays(此DateTime开始,int天)
{
int方向=数学符号(天);
完整周数=天/5;
剩余整数=天数%5;
DateTime end=start.AddDays(completeWeeks*7);
对于(int i=0;i<剩余*方向;i++)
{
public static DateTime AddWeekDays(this DateTime start, int days)
{
int direction = Math.Sign(days);
int completeWeeks = days / 5;
int remaining = days % 5;
DateTime end = start.AddDays(completeWeeks * 7);
for (int i = 0; i < remaining * direction; i++)
{
end = end.AddDays(direction * 1);
while (!IsWeekDay(end))
{
end = end.AddDays(direction * 1);
}
}
return end;
}
private static bool IsWeekDay(DateTime date)
{
DayOfWeek day = date.DayOfWeek;
return day != DayOfWeek.Saturday && day != DayOfWeek.Sunday;
}
public static DateTime AddWorkingDays(DateTime date, int daysToAdd)
{
while (daysToAdd > 0)
{
date = date.AddDays(1);
if (date.DayOfWeek != DayOfWeek.Saturday && date.DayOfWeek != DayOfWeek.Sunday) daysToAdd -= 1;
}
return date;
}