【问题标题】:Calculating elapsed time in hours from a date to current date excluding weekends计算从日期到当前日期经过的时间(以小时为单位),不包括周末
【发布时间】:2012-08-29 15:10:50
【问题描述】:

我需要以小时为单位计算从创建记录到当前时间已经过去了多少时间。困难的部分是我需要排除周末时间。

我已经为此工作了很长一段时间,但我只是迷路了。这是我到目前为止所拥有的。提前感谢您的帮助。

   Dim MyStartTime As DateTime = "2010-08-09 07:00:00.000"
    Dim MyEndTime As DateTime = DateAdd("h", -1, Now())

    Dim MyHours As Integer = 0

    If Weekday(MyStartTime) > 1 And Weekday(MyStartTime) < 6 Then

        MyHours = DateDiff("h", MyStartTime, MyEndTime)

    ElseIf Weekday(MyStartTime) = 6 Then
        Dim EndTime
        date1.Date()
        MyHours = DateDiff("h", MyStartTime, MyEndTime)


    End If

    lblHours1.Text = MyHours

VB.NET 中的哪种算法最适合这种计算?

【问题讨论】:

  • 您使用的是哪个时区?如果是遵守 DST 的当地时区,那么这将更具挑战性。

标签: vb.net


【解决方案1】:

这是一种方法:

确定整个范围的时间跨度(以小时为单位)。

确定开始和结束是否在周末。减去适当的时间。如果从周末开始,请删除直到星期一 00:00 的时间。如果在周末结束,则减去自周六 00:00 以来经过的小时数。然后考虑介于两者之间的任何完整周末。

这需要实现 3 种方法来返回要减去的小时数。如果没有,只需在每个上返回 0:

NumberOfHoursBetweenDateAndNextMonday - 在周末开始时。 NumberOfHoursBetweenDateAndEarliestSaturday - 在周末结束时。 NumberOfFullWeekendHoursWithinRange - 介于两者之间的所有日子。

Dim MyHours As TimeSpan = MyEndTime - MyStartTime

'account for start being on a weekend
If (MyStartTime.DayOfWeek = vbSaturday Or vbSunday) Then
    'subtract number of hours until Monday at 00:00
    MyHours -= NumberOfHoursBetweenDateAndNextMonday(MyStartTime)

End If

If (MyEndTimeTime.DayOfWeek = vbSaturday Or vbSunday) Then
   'subtract number of hours elapsed after Saturday at 00:00
   MyHours -= NumberOfHoursBetweenDateAndEarliestSaturday(MyEndTime)
End If

MyHours -= NumberOfFullWeekendHoursWithinRange(MyStartTime, MyEndTime)

【讨论】:

  • 非常感谢,这看起来正是我正在寻找的帮助。
【解决方案2】:

我建议使用 TimeSpan 对象来计算小时数。
http://msdn.microsoft.com/en-us/library/269ew577.aspx

除此之外,如果您能算出它在一周中的哪一天降落以及其间的星期六和星期日的数量,那么只需将该数字减去 x 24

Dim MyHours As TimeSpan = MyEndTime-MyStartTime 

【讨论】:

    【解决方案3】:

    如果您使用的是 VB.net,请尝试添加此功能:

    Public Function GetWorkdays(ByVal pstart As Date, ByVal pend As Date) As Integer
    
        If Weekday(pend) = 7 Then
            GetWorkdays = 7 - Weekday(pstart) + 5 * (DateDiff("ww", pstart, pend) - 1) + Weekday(pend) - 2
        Else
            GetWorkdays = 7 - Weekday(pstart) + 5 * (DateDiff("ww", pstart, pend) - 1) + Weekday(pend) - 1
        End If
    
    End Function
    

    您可以通过以下方式测试此代码:

    将两个日期设置为 GetWorkdays(pstart,pend) 在哪里 pstart 是您的开始日期,pend 是您的结束日期。 它将计算不包括周末的天数。

    试一试。马布海!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      相关资源
      最近更新 更多