计算vbscript中众多开始和结束时间之间的实际持续时间

时间:2014-07-04 08:23:37

标签: datetime vbscript

我必须计算每天系统用户的持续时间。所以,我有各种各样的过程,在一天的不同时间运行。我需要做的是将所有时间线合并为一个时间线,然后从那里计算出持续时间。我的问题是弄清楚重叠时间。

例如: 过程1从08:00到10:00运行 过程2从09:00到13:00运行 过程3从15:00到19:00运行 流程4从06:00到08:00运行

作为时间线的最终结果我需要的是: 时间线为06:00至13:00,15:00至19:00

我可以计算出持续时间,这只是最终的时间表。

有关方法的任何建议吗? 感谢

1 个答案:

答案 0 :(得分:1)

如果相邻跨距之间存在间隙,则需要一个排序的跨度和循环列表,而不是组合重叠跨度并创建新的跨度。为了帮助您入门,这个概念证明代码

  Dim sData
  For Each sData In Array( _
      "08:00-10:00 09:00-13:00 18:00-20:00 15:00-19:00 06:00-08:00" _
    , "08:00-10:00 09:00-13:00 18:00-20:00 15:00-19:00 06:00-08:00 11:00-16:00" _
    , "08:00-10:00 09:00-13:00 18:00-20:00 15:00-19:00 06:00-08:00 11:00-22:00" _
  )
        Dim alData : Set alData = CreateObject("System.Collections.ArrayList")
        Dim sSpan
        For Each sSpan In Split(sData)
            alData.Add sSpan
        Next
        alData.Sort
        For Each sSpan In alData
            WScript.Echo sSpan
        Next
        WScript.Echo "-------------"
        Dim aFromTo  : aFromTo      = Split(alData(0), "-")
        Dim alResult : Set alResult = CreateObject("System.Collections.ArrayList")
        Dim nCmp     : nCmp         = 0
        alResult.Add aFromTo(0)
        alResult.Add aFromTo(1)
        Dim i
        For i = 1 To (alData.Count - 1)
            aFromTo = Split(alData(i), "-")
            WScript.Echo alResult(nCmp), "-", alResult(nCmp + 1), " cmp ", aFromTo(0), "-", aFromTo(1)
            Select Case True
              Case aFromTo(0) <= alResult(nCmp + 1)
                If aFromTo(1) > alResult(nCmp + 1) Then
                   alResult(nCmp + 1) = aFromTo(1)
                End If
                WScript.Echo "Combine ==>", alResult(nCmp), "-", alResult(nCmp + 1)
              Case aFromTo(0) > alResult(nCmp + 1)
                alResult.Add aFromTo(0)
                alResult.Add aFromTo(1)
                nCmp = nCmp + 2
                WScript.Echo "New span", alResult(nCmp), "-", alResult(nCmp + 1)
              Case Else
                WScript.Echo "Surprise"
            End Select
        Next
        WScript.Echo "-------------"
        For i = 0 To (alResult.Count - 1) Step 2
            WScript.Echo alResult(i + 0) & " to " & alResult(i + 1)
        Next
        WScript.Echo "#############"
  Next

输出:

06:00-08:00
08:00-10:00
09:00-13:00
15:00-19:00
18:00-20:00
-------------
06:00 - 08:00  cmp  08:00 - 10:00
Combine ==> 06:00 - 10:00
06:00 - 10:00  cmp  09:00 - 13:00
Combine ==> 06:00 - 13:00
06:00 - 13:00  cmp  15:00 - 19:00
New span 15:00 - 19:00
15:00 - 19:00  cmp  18:00 - 20:00
Combine ==> 15:00 - 20:00
-------------
06:00 to 13:00
15:00 to 20:00
#############
06:00-08:00
08:00-10:00
09:00-13:00
11:00-16:00
15:00-19:00
18:00-20:00
-------------
06:00 - 08:00  cmp  08:00 - 10:00
Combine ==> 06:00 - 10:00
06:00 - 10:00  cmp  09:00 - 13:00
Combine ==> 06:00 - 13:00
06:00 - 13:00  cmp  11:00 - 16:00
Combine ==> 06:00 - 16:00
06:00 - 16:00  cmp  15:00 - 19:00
Combine ==> 06:00 - 19:00
06:00 - 19:00  cmp  18:00 - 20:00
Combine ==> 06:00 - 20:00
-------------
06:00 to 20:00
#############
06:00-08:00
08:00-10:00
09:00-13:00
11:00-22:00
15:00-19:00
18:00-20:00
-------------
06:00 - 08:00  cmp  08:00 - 10:00
Combine ==> 06:00 - 10:00
06:00 - 10:00  cmp  09:00 - 13:00
Combine ==> 06:00 - 13:00
06:00 - 13:00  cmp  11:00 - 22:00
Combine ==> 06:00 - 22:00
06:00 - 22:00  cmp  15:00 - 19:00
Combine ==> 06:00 - 22:00
06:00 - 22:00  cmp  18:00 - 20:00
Combine ==> 06:00 - 22:00
-------------
06:00 to 22:00
#############

应该使实验(和错误修复)变得容易。