【问题标题】:Get number of days between two Dates excluding weekends获取两个日期之间的天数,不包括周末
【发布时间】:2014-04-03 12:34:09
【问题描述】:

我使用下面的代码减去两个日期

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

它工作正常,格式正确(天.小时:分钟:秒)

我需要的是

如果关闭日期和打开日期之间的时间段包含星期五或星期六,则从结果中减去

例如。如果结果 9.03:02:10 包含 2 个星期六和星期五,则它必须是 6.03:02:10 等等

【问题讨论】:

  • 正常营业时间是几点?

标签: .net vb.net winforms date


【解决方案1】:

一种幼稚但易读的方法:

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)

【讨论】:

    【解决方案2】:

    确实应该是:

    Select day = startDay.AddDays(d)
    

    因为指定范围的开始日可能并不总是今天。

    【讨论】:

    • 对于对此答案感到困惑的每个人,这应该更像是@tim-schmelter 对答案的评论
    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 2011-04-06
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多