2015-07-08 5 views
0

С ПОМОЩЬЮ VB6 ТОЛЬКО ...Как я могу найти разницу между двумя временами, которые имеют миллисекунды

У меня есть два раза, и нужно, чтобы получить время между ними. У меня есть файл, который содержит время в формате "08:34:45:734", и мне просто нужно рассчитать разницу во времени между этими двумя значениями.

Пример:

08:34:12:744 
08:34:45:734 

мне нужно, чтобы генерировать выходной сигнал точного времени, в том числе миллисекунд, между два раза. Я попытался преобразовать в double и вычесть, но мне кажется, что я не вернусь к H:M:S:m времени, которое мне нужно.

ответ

1

Это должно сработать. Даты VB не включают количество мс, но вы можете просто отключить ms и вычислить разницу самостоятельно.

Private Function GetTimeDiff(strDate1 As String, strDate2 As String) As String 

    Dim fNeg As Boolean 
    Dim dt1 As Date, dt2 As Date 
    Dim ms1 As Long, ms2 As Long 

    ' Assign earliest date to dt1... 
    If strDate1 <= strDate2 Then 
     dt1 = Left$(strDate1, 8) 
     dt2 = Left$(strDate2, 8) 
     ms1 = Right$(strDate1, 3) 
     ms2 = Right$(strDate2, 3) 
    Else 
     dt1 = Left$(strDate2, 8) 
     dt2 = Left$(strDate1, 8) 
     ms1 = Right$(strDate2, 3) 
     ms2 = Right$(strDate1, 3) 
     fNeg = True 
    End If 

    ' If ms of starting time > ms of ending time, add a second before subtraction... 
    Dim ms As Long 
    If ms1 > ms2 Then 
     dt1 = DateAdd("s", 1, dt1) 
     ms = (1000 - ms1) + ms2 
    Else 
     ms = ms2 - ms1 
    End If 

    ' Subtract dates, get difference in seconds... 
    Dim h As Long, m As Long, s As Long 
    s = DateDiff("s", dt1, dt2) 

    ' Convert seconds to H:M:S... 
    h = s \ 3600 
    s = s Mod 3600 
    m = s \ 60 
    s = s Mod 60 

    GetTimeDiff = IIf(fNeg, "-", "") & h & ":" & m & ":" & s & ":" & ms 

End Function 

Вызов его, передавая свои значения строки и возвращает строку h:m:s:ms:

Debug.Print GetTimeDiff("08:34:12:744", "08:34:45:734") ' => "0:0:32:990" 

Если первая дата позже, чем второй, вы получите отрицательное значение:

Debug.Print GetTimeDiff("10:34:12:744", "08:34:45:734") ' => "-1:59:27:10"  
1

Я принимаю меры, чтобы разрешить индикаторы и результаты, которые переносятся в дни (более 23: 59: 59: 999 или менее -23: 59: 59: 999). Если это не проблема для вас, вы можете игнорировать оба знаковых указателя и дни, поскольку в результате подавляются «+» и «нулевые дни».

Private Function ToLong(ByVal HMSms As String) As Long 
    'Valid value range is -2:20:31:23:647 to +2:20:31:23:647, 
    'Sign indicator optional, days position optional. 
    Dim Parts() As String 
    Dim SChar As String 
    Dim Sign As Long 

    SChar = Left$(HMSms, 1) 
    If SChar = "+" Or SChar = "-" Then 
     HMSms = Mid$(HMSms, 2) 
     Sign = IIf(SChar = "+", 1, -1) 
    Else 
     Sign = 1 
    End If 
    Parts = Split(HMSms, ":") 
    If UBound(Parts) < 4 Then 
     Parts = Split("0:" & HMSms, ":") 
    End If 
    ToLong = CLng(Parts(4)) _ 
      + CLng(Parts(3)) * 1000& _ 
      + CLng(Parts(2)) * 1000& * 60& _ 
      + CLng(Parts(1)) * 1000& * 60& * 60& _ 
      + CLng(Parts(0)) * 1000& * 60& * 60& * 24& 
    ToLong = ToLong * Sign 
End Function 

Private Function Diff(ByVal Minu As String, ByVal Subtra As String) As String 
    'Result suppresses positive sign indicator and 0 value in days position. 
    Dim DiffLong As Long 
    Dim SChar As String 

    DiffLong = ToLong(Minu) - ToLong(Subtra) 
    If DiffLong < 0 Then 
     SChar = "-" 
     DiffLong = -DiffLong 
    End If 
    Diff = "0:00:00:00:000" 
    Mid$(Diff, 1, 1) = Format$(DiffLong \ (1000& * 60& * 60& * 24&), "0") 
    Mid$(Diff, 3, 2) = Format$(DiffLong \ (1000& * 60& * 60&) Mod 24&, "00") 
    Mid$(Diff, 6, 2) = Format$(DiffLong \ (1000& * 60&) Mod 60&, "00") 
    Mid$(Diff, 9, 2) = Format$(DiffLong \ 1000& Mod 60&, "00") 
    Mid$(Diff, 12, 3) = Format$(DiffLong Mod 1000&, "000") 
    If Left$(Diff, 1) = "0" Then Diff = Mid$(Diff, 3) 
    Diff = SChar & Diff 
End Function 

Некоторые результаты тестовых примеров:

08:34:45:734 - 08:34:12:744 = 00:00:32:990 
08:34:45:734 - 08:34:40:734 = 00:00:05:000 
08:34:12:744 - 08:34:45:734 = -00:00:32:990 
-00:00:00:000 - +00:00:00:000 = 00:00:00:000 
+00:00:00:000 - 00:00:00:001 = -00:00:00:001 
1:00:00:00:000 - 00:00:00:001 = 23:59:59:999 
-2:00:00:00:000 - 00:00:00:000 = -2:00:00:00:000 
-12:00:00:000 - 12:00:00:000 = -1:00:00:00:000 
-23:59:59:999 - 00:00:00:000 = -23:59:59:999 
Смежные вопросы