.NET日期比较:计算自日期以来的工作日数?

时间:2020-03-06 15:03:50  来源:igfitidea点击:

自日期以来计算工作天数的最简单方法是什么?首选VB.NET,但Cis还可以。

所谓"工作日",是指除星期六和星期日以外的所有日子。如果该算法还可以考虑一系列不应该算作工作日的特定"排除"日期,那将是很重要的。

在此先感谢我们贡献的天才。

解决方案

这是用于SQL Server的方法。页面上还有一个vbscript方法。我知道我们要求的不完全是。

最简单的方法可能是

DateTime start = new DateTime(2008, 10, 3);
DateTime end = new DateTime(2008, 12, 31);
int workingDays = 0;
while( start < end ) {
  if( start.DayOfWeek != DayOfWeek.Saturday
   && start.DayOfWeek != DayOfWeek.Sunday ) {
      workingDays++;
  }
  start = start.AddDays(1);
}

它可能不是最有效的,但它确实允许轻松检查假期列表。

DateDiff和其他一些Date *函数是VB.NET独有的,并且经常引起Cdevelopers的羡慕。不过,不确定在这种情况下是否会很有帮助。

我们结合了两个CodeProject文章,以得出一个完整的解决方案。我们的库不够简洁,无法发布为源代码,但是我可以为我们指出我们用来实现所需功能的两个项目。与CodeProject文章一样,请阅读注释,其中可能包含重要信息。

计算工作日:http://www.codeproject.com/KB/cs/busdatescalculation.aspx

其他工作日计算:http://www.codeproject.com/KB/cs/datetimelib.aspx

计算假期:http://www.codeproject.com/KB/dotnet/HolidayCalculator.aspx

一般而言(无代码)-

  • 减去日期以获得天数
  • 除以7得到周数
  • 减去周数乘以2
  • 计算属于该日期范围的假期日期数
  • 减去那个数

弄乱开始/结束日期,使它们在星期一至星期一降落,然后加回差额

[对无代码通用性的道歉,已经太迟了]

[c.f. endDate.Subtract(startDate).TotalDays]

这会做我们想要的。转换为VB.NET应该很容易,但是我已经花了很长时间才能做到。

DateTime start = DateTime.Now;
DateTime end = start.AddDays(9);
IEnumerable<DateTime> holidays = new DateTime[0];

// basic data
int days = (int)(end - start).TotalDays;
int weeks = days / 7;

// check for a weekend in a partial week from start.
if (7- (days % 7) <= (int)start.DayOfWeek)
    days--;
if (7- (days % 7) <= (int)start.DayOfWeek)
    days--;

// lose the weekends
days -= weeks * 2;

foreach (DateTime dt in holidays)
{
    if (dt > start && dt < end)
        days--;
}