Конвертация секунд в HH:MM:SS

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
VAngel
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 81
Зарегистрирован: 13.01.2005 (Чт) 0:10
Откуда: 2:5030

Конвертация секунд в HH:MM:SS

Сообщение VAngel » 13.01.2005 (Чт) 0:40

Уважаемые знатоки скажите у меня есть время в секундах, скажем 3001 как мне его просто преобразовать к виду HH:MM:SS?
У меня написан дикий код.... очень большой основаный на одной математике, а может есть простое средство

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.01.2005 (Чт) 1:53

Код: Выделить всё
Debug.Print CDate(3001 / 86400)
Изображение

VAngel
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 81
Зарегистрирован: 13.01.2005 (Чт) 0:10
Откуда: 2:5030

Сообщение VAngel » 13.01.2005 (Чт) 2:33

Спасибо, круто :lol:

Qubicz
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 16.10.2004 (Сб) 20:21
Откуда: Санкт-Петербург

Сообщение Qubicz » 13.01.2005 (Чт) 6:32

Как вариант
Код: Выделить всё
MsgBox TimeSerial(0, 0, sec)

VAngel
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 81
Зарегистрирован: 13.01.2005 (Чт) 0:10
Откуда: 2:5030

Сообщение VAngel » 13.01.2005 (Чт) 17:40

2 tyomitch:
Спасибо, это работает, но имеет ограничения 86399 секунд, а при превышении начинает возвращать дату 31.12.1899

2 Qubicz:
Спасибо, но выдает ошибку уже на 35000

Все равно всем спасибо за внимание :)

Скажите,что делать с темой мне ее удалить или оставить?

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

Сообщение GSerg » 13.01.2005 (Чт) 17:47

Ну раз без ограничений, то:
hh=3001\3600
mm=(3001-hh*3600)\600
ss=3001 mod 60

А тему.... Ну удали, попробуй, попробуй... :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VAngel
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 81
Зарегистрирован: 13.01.2005 (Чт) 0:10
Откуда: 2:5030

Сообщение VAngel » 13.01.2005 (Чт) 21:30

Да можно сли его дописать слегка, все равно вырастет в приличный код

Мне столько не нужно меня вполне строит и ограничение в 30000 сек :)

VAngel
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 81
Зарегистрирован: 13.01.2005 (Чт) 0:10
Откуда: 2:5030

Сообщение VAngel » 13.01.2005 (Чт) 22:18

А как можно сравнить две даты или значения времени?
Т.е. узнать какое событие было позже

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

Сообщение A.A.Z. » 13.01.2005 (Чт) 22:27

Код: Выделить всё
If CLng(Date1) > CLng(Date2) Then MsgBox "1 больше" Else MsgBox "2 больше"

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 13.01.2005 (Чт) 23:53

A.A.Z. писал(а):
Код: Выделить всё
If CLng(Date1) > CLng(Date2) Then MsgBox "1 больше" Else MsgBox "2 больше"

Ну-ну. Поставь:
Код: Выделить всё
Date1 = "2005-01-01 09:00:00"
Date2 = "2005-01-01 08:00:00"

И получишь, что они равны :). Сравнивать можно даты напрямую, без предварительного округления до дней, басик это умеет.
VAngel писал(а):Спасибо, это работает, но имеет ограничения 86399 секунд, а при превышении начинает возвращать дату 31.12.1899

А знаешь, почему? Потому что 86400 секунд - это ровно одни сутки :). Поэтому, деля такое число на 86400, ты получишь интервал больше одного дня. Так что ты пишешь примерно так:
Код: Выделить всё
Dim D as Date
D = CDate(3001 / 86400)

После этого ты в переменной D получаешь значение типа дата (а не какое-то там, панимаишь, количество секунд в лонге), которое уже можно спокойно использовать во всяких функциях, работающих с датами - DateAdd(), DateDiff(), DatePart(), ну и так далее.

А вообще, матчасть по тебе просто плачет...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.01.2005 (Пт) 3:38

Ennor, тип "Date" означает "Дата и время", т.ч. твой код также не будет работать для интервалов больше суток.

WFIW, у меня до сих пор хранится программа из одной строчки, выдающаяя аптайм в днях, часах, минутах и секундах:
Код: Выделить всё
MsgBox IIf(GetTickCount > 0, "Windows up for: " & Int(GetTickCount / 86400000) & " days, " & _
        CDate((GetTickCount Mod 86400000) / 86400000), "Windows up for: " & Int((4294967296# + _
        GetTickCount) / 86400000) & " days, " & CDate(((4294967296# + GetTickCount) / 86400000) _
        - Int((4294967296# + GetTickCount) / 86400000)))

Писалось на спор ( http://groups.google.ca/groups?hl=en&lr ... 096.z2.ftn )
Изображение

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 14.01.2005 (Пт) 11:22

tyomitch писал(а):Ennor, тип "Date" означает "Дата и время", т.ч. твой код также не будет работать для интервалов больше суток.
...

Если честно, я не совсем понял, что значит "работать" в данном контексте. Поясни, плз...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.01.2005 (Пт) 13:51

"Работать" значит "возвращать 27:46:40 для числа 100000" ;-)
Изображение

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 14.01.2005 (Пт) 17:11

Это невозможно, ты сам прекрасно знаешь:
Код: Выделить всё
Debug.Print CDate(100000 / 86400)

возвращает:
31.12.1899 3:46:40

Проще говоря, указанные тобой 27 с хвостиком часов не являются корректно отформатированной датой-временем. И ты никогда не найдешь ни в одном серьезном продукте так записанного интервала времени - всегда будет отдельно указываться количество дней. Хотя, конечно, если у кого-то в ТЗ написано русским по белому - "чтобы показывало 27 часов!" - то, конечно, не поспоришь...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.01.2005 (Сб) 3:58

Это невозможно при использовании типа Date, но возможно, например, при использовании кода GSerg-а (\ и Mod).

Про то, должно быть у VAngel с днями или без дней - не знаю :-|
Изображение

VAngel
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 81
Зарегистрирован: 13.01.2005 (Чт) 0:10
Откуда: 2:5030

Сообщение VAngel » 15.01.2005 (Сб) 12:44

А скажите пожалуйста раз вы начали обсуждать, то подкиньте мне пожалуйста доку или просто ссылку с мат частью, не где описаны все эти деления без остадка и пр.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.01.2005 (Сб) 12:53

Действия всего два:
\ - деление без остатка
Mod - остаток от деления
Пример:
Код: Выделить всё
Debug.Print 10 \ 3 ' 3
Debug.Print 10 Mod 3 ' 1
Изображение

VAngel
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 81
Зарегистрирован: 13.01.2005 (Чт) 0:10
Откуда: 2:5030

Сообщение VAngel » 15.01.2005 (Сб) 17:42

Это все хорошо конечно, а есть дока с описанием подобных вещей?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.01.2005 (Вс) 2:59

Дык MSDN ;-)
Изображение


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

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

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

    TopList