比如2001-5-12 10:20:00 减去1000分钟
但是要求这1000分钟不能包括周六日也不包括早上8:00之前和17:00之后
换句话说就是有效的上班时间
请问有没有好的算法
我本来是用1000/480得到有效天数,然后运算,但是运算的时候要讨论是不是周末
剩下的余数在讨论,是不是有效时间,总之麻烦的很,而且不能确定有没有bug
希望找到更好的算法

解决方案 »

  1.   

    使用DateAdd函数,比如减去1000分钟:dateadd("n",-1000,"2001-5-12 10:20:00")
    至于判断是否为星期六,则使用weekday函数。
      

  2.   

    注意一下weekday函数使用:weekday("2001-5-12",vbMonday ),返回值为1表示星期一,为7表示星期天。
      

  3.   

    Option ExplicitSub Main()
        Debug.Print WorkTimeSub(#5/12/2001 10:20:00 AM#, 1000)
        Debug.Print WorkTimeSub(#7/22/2010 10:30:00 AM#, 60& * 8)
        Debug.Print WorkTimeSub(#7/22/2010 10:30:00 AM#, 60& * 8 * 3)
        Debug.Print WorkTimeSub(#7/22/2010 10:30:00 AM#, 60& * 8 * 12)
        Debug.Print WorkTimeSub(#7/22/2010 10:30:00 AM#, 60& * 8 * 12 + 60& * 2)
        Debug.Print WorkTimeSub(#7/22/2010 10:30:00 AM#, 60& * 8 * 12 + 60& * 7)
    End Sub'注:不检查 Date1 是否为有效的工作时间'
    Function WorkTimeSub(ByVal Date1 As Date, ByVal Minutes As Long) As Date
        Dim dt          As Date
        Dim lMinutes    As Long
        Dim lWorkDays   As Long
        Dim lWeeks      As Long
        
        lMinutes = Minutes Mod 480
        lWorkDays = Minutes \ 480
        If lMinutes > DateDiff("n", #8:00:00 AM#, TimeValue(Date1)) Then
            lWorkDays = lWorkDays + 1
            dt = DateAdd("n", 480 - lMinutes, Date1)
        Else
            dt = DateAdd("n", -lMinutes, Date1)
        End If
        
        lWeeks = lWorkDays \ 5
        lWorkDays = lWorkDays Mod 5
        If lWorkDays >= Weekday(dt, vbMonday) Then
            lWeeks = lWeeks + 1
            dt = DateAdd("d", 5 - lWorkDays, dt)
        Else
            dt = DateAdd("d", -lWorkDays, dt)
        End If
        
        WorkTimeSub = DateAdd("ww", -lWeeks, dt)
    End Function