添加工作日和GetBusinessDays [英] Add Business Days and GetBusinessDays
问题描述
我需要找到2优雅的完整实现
公共静态的DateTime AddBusinessDays(这个日期时间日期,INT天)
{
// code在这里
}
和
公共静态INT GetBusinessDays(这个日期开始,日期时间结束)
{
// code在这里
}
O(1)preferable(无环路)。
编辑: 通过工作日我的意思是工作日(周一,周二,周三,周四,周五)。无节假日,只是周末除外。
我已经有一些丑陋的解决方案,似乎工作,但我不知道是否有优雅的方式来做到这一点。谢谢
这就是我写这么远。它的工作原理在所有情况下,并不会否定了。 还需要一个GetBusinessDays实施
公共静态的DateTime AddBusinessDays(这个日期的startDate,
INT businessDays)
{
INT方向= Math.Sign(businessDays);
如果(方向== 1)
{
如果(startDate.DayOfWeek == DayOfWeek.Saturday)
{
的startDate = startDate.AddDays(2);
businessDays = businessDays - 1;
}
否则,如果(startDate.DayOfWeek == DayOfWeek.Sunday)
{
的startDate = startDate.AddDays(1);
businessDays = businessDays - 1;
}
}
其他
{
如果(startDate.DayOfWeek == DayOfWeek.Saturday)
{
的startDate = startDate.AddDays(-1);
businessDays = businessDays + 1;
}
否则,如果(startDate.DayOfWeek == DayOfWeek.Sunday)
{
的startDate = startDate.AddDays(-2);
businessDays = businessDays + 1;
}
}
INT initialDayOfWeek = Convert.ToInt32(startDate.DayOfWeek);
INT weeksBase = Math.Abs(businessDays / 5);
INT addDays = Math.Abs(businessDays%5);
如果((方向== 1&安培;&安培; addDays + initialDayOfWeek→5)||
(方向== -1放大器;&安培; addDays> = initialDayOfWeek))
{
addDays + = 2;
}
INT totalDays =(weeksBase * 7)+ addDays;
返回startDate.AddDays(totalDays *方向);
}
最新尝试你的第一个功能:
公共静态的DateTime AddBusinessDays(日期时间日期,INT天)
{
如果(天℃,)
{
抛出新的ArgumentException(天不能为负,天);
}
如果(天== 0)返回日期;
如果(date.DayOfWeek == DayOfWeek.Saturday)
{
日期= date.AddDays(2);
天 - = 1;
}
否则,如果(date.DayOfWeek == DayOfWeek.Sunday)
{
日期= date.AddDays(1);
天 - = 1;
}
日期= date.AddDays(天/ 5 * 7);
INT extraDays =天数5%;
如果((int)的date.DayOfWeek + extraDays→5)
{
extraDays + = 2;
}
返回date.AddDays(extraDays);
}
的第二个功能,GetBusinessDays,可以如下实施:
公共静态INT GetBusinessDays(DateTime的开始,结束日期时间)
{
如果(start.DayOfWeek == DayOfWeek.Saturday)
{
开始= start.AddDays(2);
}
否则,如果(start.DayOfWeek == DayOfWeek.Sunday)
{
开始= start.AddDays(1);
}
如果(end.DayOfWeek == DayOfWeek.Saturday)
{
结束= end.AddDays(-1);
}
否则,如果(end.DayOfWeek == DayOfWeek.Sunday)
{
结束= end.AddDays(-2);
}
INT差异=(int)的end.Subtract(开始).TotalDays;
INT结果=差异/ 7 * 5 + DIFF%7;
如果(end.DayOfWeek< start.DayOfWeek)
{
返回结果 - 2;
}
其他{
返回结果;
}
}
I need to find 2 elegant complete implementations of
public static DateTime AddBusinessDays(this DateTime date, int days)
{
// code here
}
and
public static int GetBusinessDays(this DateTime start, DateTime end)
{
// code here
}
O(1) preferable (no loops).
EDIT: By business days i mean working days (Monday, Tuesday, Wednesday, Thursday, Friday). No holidays, just weekends excluded.
I already have some ugly solutions that seem to work but i wonder if there are elegant ways to do this. Thanks
This is what i've written so far. It works in all cases and does negatives too. Still need a GetBusinessDays implementation
public static DateTime AddBusinessDays(this DateTime startDate,
int businessDays)
{
int direction = Math.Sign(businessDays);
if(direction == 1)
{
if(startDate.DayOfWeek == DayOfWeek.Saturday)
{
startDate = startDate.AddDays(2);
businessDays = businessDays - 1;
}
else if(startDate.DayOfWeek == DayOfWeek.Sunday)
{
startDate = startDate.AddDays(1);
businessDays = businessDays - 1;
}
}
else
{
if(startDate.DayOfWeek == DayOfWeek.Saturday)
{
startDate = startDate.AddDays(-1);
businessDays = businessDays + 1;
}
else if(startDate.DayOfWeek == DayOfWeek.Sunday)
{
startDate = startDate.AddDays(-2);
businessDays = businessDays + 1;
}
}
int initialDayOfWeek = Convert.ToInt32(startDate.DayOfWeek);
int weeksBase = Math.Abs(businessDays / 5);
int addDays = Math.Abs(businessDays % 5);
if((direction == 1 && addDays + initialDayOfWeek > 5) ||
(direction == -1 && addDays >= initialDayOfWeek))
{
addDays += 2;
}
int totalDays = (weeksBase * 7) + addDays;
return startDate.AddDays(totalDays * direction);
}
Latest attempt for your first function:
public static DateTime AddBusinessDays(DateTime date, int days)
{
if (days < 0)
{
throw new ArgumentException("days cannot be negative", "days");
}
if (days == 0) return date;
if (date.DayOfWeek == DayOfWeek.Saturday)
{
date = date.AddDays(2);
days -= 1;
}
else if (date.DayOfWeek == DayOfWeek.Sunday)
{
date = date.AddDays(1);
days -= 1;
}
date = date.AddDays(days / 5 * 7);
int extraDays = days % 5;
if ((int)date.DayOfWeek + extraDays > 5)
{
extraDays += 2;
}
return date.AddDays(extraDays);
}
The second function, GetBusinessDays, can be implemented as follows:
public static int GetBusinessDays(DateTime start, DateTime end)
{
if (start.DayOfWeek == DayOfWeek.Saturday)
{
start = start.AddDays(2);
}
else if (start.DayOfWeek == DayOfWeek.Sunday)
{
start = start.AddDays(1);
}
if (end.DayOfWeek == DayOfWeek.Saturday)
{
end = end.AddDays(-1);
}
else if (end.DayOfWeek == DayOfWeek.Sunday)
{
end = end.AddDays(-2);
}
int diff = (int)end.Subtract(start).TotalDays;
int result = diff / 7 * 5 + diff % 7;
if (end.DayOfWeek < start.DayOfWeek)
{
return result - 2;
}
else{
return result;
}
}
这篇关于添加工作日和GetBusinessDays的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!