Как получить временной интервал? Помогите, плиз.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Как получить временной интервал? Помогите, плиз.

Сообщение Ruslan Demidow » 16.07.2004 (Пт) 15:10

Имеются две даты. Нужно получить временной интервал между ними отображаемый в формате DD HH:MM:SS
Т.е. разницу между ними в количестве дней, часов (в пределах суток), минутах (в пределах часа), секундах (в пределах минуты).
Я уже по всякому пробовал - не выходит. Или получается не то что нужно, или заползаю в такие дебри кода и промежуточных данных, что аж плохо становится.
Помогите плиз. Может кто-то делал такое уже. :(

Шурик
Самогонщик
Самогонщик
Аватара пользователя
 
Сообщения: 1657
Зарегистрирован: 30.06.2003 (Пн) 13:27
Откуда: из запоя :))))) Матных сообщений: 972

Сообщение Шурик » 16.07.2004 (Пт) 15:14

Да... помогите, мне тожа это нужно, чето сам не допираю как сделать!!!
В инете искал нефика не нашел :? :(

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.07.2004 (Пт) 16:47

Один из вариантов:
Код: Выделить всё
Function DeltaDate(ByVal Date1 As Date, ByVal Date2 As Date, Optional ByVal ItemSeparator As String = vbSpace, Optional ByVal SecondsSuffix As String, Optional ByVal MinutesSuffix As String, Optional ByVal HoursSuffix As String, Optional ByVal DaysSuffix As String) As String
Const SM As Long = 60&, MH As Long = 60&, HD As Long = 24&
Dim D As Long, H As Long, M As Long, S As Long
If Date2 > Date1 Then
  S = (Date2 - Date1) * SM * MH * HD
Else
  S = (Date1 - Date2) * SM * MH * HD
End If
If Len(DaysSuffix) > 0 Then
  M = Fix(S / SM)
  S = S - M * SM
  H = Fix(M / MH)
  M = M - H * MH
  D = Fix(H / HD)
  H = H - D * HD
  DeltaDate = Trim$(Str$(D)) & DaysSuffix _
            & IIf(Len(HoursSuffix) = 0, vbNullString, ItemSeparator & Trim$(Str$(H)) & HoursSuffix) _
            & IIf(Len(MinutesSuffix) = 0, vbNullString, ItemSeparator & Trim$(Str$(M)) & MinutesSuffix) _
            & IIf(Len(SecondsSuffix) = 0, vbNullString, ItemSeparator & Trim$(Str$(S)) & SecondsSuffix)
ElseIf Len(HoursSuffix) > 0 Then
  M = Fix(S / SM)
  S = S - M * SM
  H = Fix(M / MH)
  M = M - H * MH
  DeltaDate = Trim$(Str$(H)) & HoursSuffix _
            & IIf(Len(MinutesSuffix) = 0, vbNullString, ItemSeparator & Trim$(Str$(M)) & MinutesSuffix) _
            & IIf(Len(SecondsSuffix) = 0, vbNullString, ItemSeparator & Trim$(Str$(S)) & SecondsSuffix)
ElseIf Len(MinutesSuffix) > 0 Then
  M = Fix(S / SM)
  S = S - M * SM
  DeltaDate = Trim$(Str$(M)) & MinutesSuffix _
            & IIf(Len(SecondsSuffix) = 0, vbNullString, ItemSeparator & Trim$(Str$(S)) & SecondsSuffix)
Else
  DeltaDate = Format$(S, "0") & SecondsSuffix
End If
End Function


Использовать:
Debug.Print DeltaDate(Now()-2.3, Now(), , , " м.", " ч.", " д.")
Lasciate ogni speranza, voi ch'entrate.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 16.07.2004 (Пт) 16:50

А вот мой вариант (пока его делал, alibek уже ответил, а выкидывать жалко :)):
Код: Выделить всё
Function Raznitsa(ByVal Date1 As Date, ByVal Date2 As Date) As String
Dim Seconds@, Minutes@, Hours@, Days@, S@, D1 As Date, D2 As Date
If Date2 < Date1 Then D1 = Date2: D2 = Date1 Else D1 = Date1: D2 = Date2
Seconds = DateDiff("s", D1, D2, vbMonday)
Days = Int(Seconds / 86400@)
If Days = 0 Then
Hours = Int(Seconds / 3600)
  If Hours = 0 Then
   Minutes = Int(Seconds / 60)
    If Minutes = 0 Then
     Raznitsa = "0 00:00:" & Conv(Seconds): Exit Function
    Else
     S = Seconds - Minutes * 60
     Raznitsa = "0 00:" & Conv(Minutes) & ":" & Conv(S): Exit Function
    End If
Else
  Hours = Int(Seconds / 3600)
  S = Seconds - Hours * 3600
  Minutes = Int(S / 60)
  If Minutes = 0 Then
   Raznitsa = "0 " & Conv(Hours) & ":" & "00:" & Conv(S): Exit Function
  Else
   S = S - Minutes * 60
   Raznitsa = "0 " & Conv(Hours) & ":" & Conv(Minutes) & ":" & Conv(S): Exit Function
  End If
End If
Else
S = Seconds - Days * 86400
Hours = Int(S / 3600)
If Hours = 0 Then
  Minutes = Int(S / 60)
  If Minutes = 0 Then
   Raznitsa = CStr(Days) & " 00:00:" & Conv(S)
  Else
   S = S - Minutes * 60
   Raznitsa = CStr(Days) & " 00:" & Conv(Minutes) & ":" & Conv(S)
  End If
Else
  S = S - Hours * 3600
  Minutes = Int(S / 60)
  If Minutes = 0 Then
   Raznitsa = CStr(Days) & " " & Conv(Hours) & ":" & "00:" & Conv(S): Exit Function
  Else
   S = S - Minutes * 60
   Raznitsa = CStr(Days) & " " & Conv(Hours) & ":" & Conv(Minutes) & ":" & Conv(S): Exit Function
  End If
End If
End If
End Function

Function Conv(ByVal Number As Long) As String
If Len(CStr(Number)) = 1 Then Conv = "0" & CStr(Number) Else Conv = CStr(Number)
End Function
Использовать: Debug.Print Raznitsa(Date1, Date2)
Я посчитал, разница между двумя датами не должна превышать 487452 лет. :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.07.2004 (Пт) 17:22

Люди...
Вы, это...
Мануал читаете иногда? :wink:
Чем вам DateDiff не нравится? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Шурик
Самогонщик
Самогонщик
Аватара пользователя
 
Сообщения: 1657
Зарегистрирован: 30.06.2003 (Пн) 13:27
Откуда: из запоя :))))) Матных сообщений: 972

Сообщение Шурик » 17.07.2004 (Сб) 0:01

GSerg писал(а):Люди...
Вы, это...
Мануал читаете иногда? :wink:
Чем вам DateDiff не нравится? :)


Все равно возьму все на вооружение :wink: :D

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 17.07.2004 (Сб) 13:16

Так ведь DateDiff только в чем-нибудь (в сек., мин. и т.д.) выводит, а чтобы в формате - я не видел... :roll:

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 19.07.2004 (Пн) 11:23

Alibek & A.A.Z. - Спасибо большое. :lol:
Попробую оба варианта :D

Zer
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 460
Зарегистрирован: 26.09.2003 (Пт) 13:08
Откуда: Нижний Новгород

Сообщение Zer » 19.07.2004 (Пн) 11:56

Ой, ну зачем-же так извращатся... Почему-бы не подсчитать вручную?
По объёму будет столько-же, но на сколько проще... :?
Microsoft DirectX - Маломягкий Прямой Х...
Не откладывай на завтра то, что можно выпить сегодня...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: PetalBot, Yandex-бот и гости: 16

    TopList