2014-04-03 151 views
0

我用下面的代码获取天数两个日期之间不包括周末

Dim OpenDate, ClosedDate As DateTime 
dim Result as String 
OpenDate = Convert.ToDateTime(some string contain date and time) 
ClosedDate = Convert.ToDateTime(some string contain date and time) 
Result = ClosedDate.Subtract(OpenDate).ToString 

它正常工作与正确结果格式减去两个日期(day.hour:分:秒)

我需要什么是

如果关闭和打开日期之间的时间段包含从结果

防爆周五或周六减法。如果造成9.03:02:10包含2个周六和周五它必须是6.03:02:10等

+0

什么是正常工作时间? – Crono

回答

6

一个天真,但可读的做法:

Public Shared Function GetBusinessDays(startDay As DateTime, endDay As DateTime) As Integer 
    Dim today = Date.Today 
    Dim weekend = {DayOfWeek.Saturday, DayOfWeek.Sunday} 
    Dim businessDays = 
     From d In Enumerable.Range(0, (endDay.Date - startDay.Date).Days + 1) 
     Select day = today.AddDays(d) 
     Where Not weekend.Contains(day.DayOfWeek) 
    Return businessDays.Count() 
End Function 

测试:

Dim days As Int32 = GetBusinessDays(Date.Now, Date.Now.AddDays(9)) 
Console.Write(days) ' 7 

的LINQ查询首先创建一个从0到天的整数范围(+1,因为包括最后一天)。然后它通过today.AddDays(days)创建Date对象。由于weekendDayOfWeek的数组,因此您可以使用Enumerable.Contains仅记录不是周末日期的日期。最后一步是使用Enumerable.Count来执行查询以获取工作日数。

你可以通过为银行,假期ParamArray改进:

Public Shared Function GetBusinessDays(startDay As DateTime, endDay As DateTime, ParamArray bankHoliday As Date()) As Integer 
    Dim today = Date.Today 
    Dim nonWorkingDays = New HashSet(Of Date)(bankHoliday) 
    Dim weekend = {DayOfWeek.Saturday, DayOfWeek.Sunday} 
    Dim businessDays = 
     From d In Enumerable.Range(0, (endDay - startDay).Days + 1) 
     Select day = today.AddDays(d) 
     Where Not weekend.Contains(day.DayOfWeek) AndAlso Not nonWorkingDays.Contains(day) 
    Return businessDays.Count() 
End Function 

这工作,因为它是,即使你没有银行放假天。如果你有一个或多个可以传递一个真正的数组作为参数或单个对象喜欢这里的圣诞礼物:

Dim christmas = New Date(2014, 12, 25) 
Dim days As Int32 = GetBusinessDays(Date.Now, Date.Now.AddDays(9), christmas) 

或几个单一对象:

Dim christmasEve = New Date(2014, 12, 24) 
Dim days As Int32 = GetBusinessDays(Date.Now, Date.Now.AddDays(9), christmasEve, christmas) 
相关问题