|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Конвертирование времени |
|
Delphi - Конвертирование времени
|
Пользователь Сообщения: 108 |
Добрый день. Не так давно решил переписать участки с говнокодом в программе, до этого не было времени, а функции были не важные, сейчас переработал два куска кода, но после исправления второго нечаянно обнаружил проблему. Сама функция занимается переводом секунд в минуты, часы... казалось, что проще, оказалось и тут проблема есть. Привожу код:
function ConvertTime(timeExt: Extended):string; var m, w, d, h, min, sec: Int64; begin m := Trunc(Convert(timeExt, tuSeconds, tuMonths)); timeExt := timeExt - m * 2592000; w := Trunc(Convert(timeExt, tuSeconds, tuWeeks)); timeExt := timeExt - w * 604800; d := Trunc(Convert(timeExt, tuSeconds, tuDays)); timeExt := timeExt - d * 86400; h := Trunc(Convert(timeExt, tuSeconds, tuHours)); timeExt := timeExt - h * 3600; min := Trunc(Convert(timeExt, tuSeconds, tuMinutes)); sec := Trunc(timeExt - min * 60); if m <> 0 then Result := IntToStr(m) + ' мес '; if w <> 0 then Result := Result + IntToStr(w) + ' нед '; if d <> 0 then Result := Result + IntToStr(d) + ' д '; if h <> 0 then Result := Result + IntToStr(h) + ' ч '; if min <> 0 then Result := Result + IntToStr(min) + ' м '; if sec <> 0 then Result := Result + IntToStr(sec) + ' с '; if (m = 0) and (w = 0) and (d = 0) and (h = 0) and (min = 0) and (sec = 0) then Result := '0 c'; end; ![]() |
|
Отправлено: 14:35, 21-08-2012 |
![]() Ветеран Сообщения: 1803
|
Профиль | Отправить PM | Цитировать Можно попробовать не отсекать дробную часть (TRUNC), а округлять возвращаемое целое - ROUND(Int(...).
А, вообще, мне кажется, лучше измерять интервал используя TDateTime (1 сек = 1 / (24 * 60 * 60). |
------- Последний раз редактировалось opel431, 21-08-2012 в 23:23. Отправлено: 23:12, 21-08-2012 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 108
|
Профиль | Отправить PM | Цитировать Цитата:
Цитата:
Цитата:
|
|||
Отправлено: 00:16, 22-08-2012 | #3 |
![]() Ветеран Сообщения: 1803
|
Профиль | Отправить PM | Цитировать Цитата novashdima:
http://www.delphicode.org/math/Trunc_function.htm |
|
------- Отправлено: 02:24, 22-08-2012 | #4 |
Пользователь Сообщения: 108
|
Профиль | Отправить PM | Цитировать Цитата opel431:
насчет главного вопроса, пока сделал простым делением, но хотелось бы все таки понять, почему не работает этот вариант перевода. Кстати пробовал также написать более грамотно, борясь с возможными лагами и т.д., но главный баг (а может это и не баг) так и остался, вот доработанный код: function ConvertTime(timeExt: Extended):string; var m, w, d, h, min, sec: Int64; begin m := Trunc(Convert(timeExt, tuSeconds, tuMonths)); timeExt := timeExt - Trunc(Convert(m, tuMonths, tuSeconds)); w := Trunc(Convert(timeExt, tuSeconds, tuWeeks)); timeExt := timeExt - Trunc(Convert(w, tuWeeks, tuSeconds)); d := Trunc(Convert(timeExt, tuSeconds, tuDays)); timeExt := timeExt - Trunc(Convert(d, tuDays, tuSeconds)); h := Trunc(Convert(timeExt, tuSeconds, tuHours)); timeExt := timeExt - Trunc(Convert(h, tuHours, tuSeconds)); min := Trunc(Convert(timeExt, tuSeconds, tuMinutes)); sec := timeExt - Trunc(Convert(min, tuMinutes, tuSeconds)); if m <> 0 then Result := IntToStr(m) + ' мес '; if w <> 0 then Result := Result + IntToStr(w) + ' нед '; if d <> 0 then Result := Result + IntToStr(d) + ' д '; if h <> 0 then Result := Result + IntToStr(h) + ' ч '; if min <> 0 then Result := Result + IntToStr(min) + ' м '; if sec <> 0 then Result := Result + IntToStr(sec) + ' с '; if (m = 0) and (w = 0) and (d = 0) and (h = 0) and (min = 0) and (sec = 0) then Result := '0 c'; end; |
||
Отправлено: 04:04, 22-08-2012 | #5 |
Новый участник Сообщения: 40
|
Профиль | Отправить PM | Цитировать Вот еще пример конвертации секунд. Я правда остановился на днях, но мне больше и не надо было
function SecToTimeStr(Seconds : Integer) : String; const SecPerDay = 86400; SecPerHour = 3600; SecPerMinute = 60; var dd, ss, mm, hh: Cardinal; str : String; begin str := ''; dd := Seconds div SecPerDay; hh := (Seconds mod SecPerDay) div SecPerHour; mm := ((Seconds mod SecPerDay) mod SecPerHour) div SecPerMinute; ss := ((Seconds mod SecPerDay) mod SecPerHour) mod SecPerMinute; str := Format('%2.2d:%2.2d:%2.2d',[hh,mm,ss]); if dd>0 then str := Format('%d дн ',[dd])+str; result := str; end; |
Отправлено: 11:38, 22-08-2012 | #6 |
Пользователь Сообщения: 108
|
Профиль | Отправить PM | Цитировать AlexVol, я тоже переделал код до обычного деления, у меня чуть попроще получилось, хотя кое какие упрощения мне подсказали)
function DivAndMod(var Value : Int64; Divider : Byte):Int64; begin Result := Value mod Divider; Value := Value div Divider; end; function ConvertTime(m: Int64):string; var m, w, d, h, min, sec: Int64; begin sec := DivAndMod(m, 60); min := DivAndMod(m, 60); h := DivAndMod(m, 24); w := DivAndMod(m, 30); d := DivAndMod(w, 7); //остальные действия end; |
Отправлено: 14:30, 22-08-2012 | #7 |
Пользователь Сообщения: 108
|
Профиль | Отправить PM | Цитировать Цитата AlexVol:
|
|
Отправлено: 03:22, 24-08-2012 | #8 |
Новый участник Сообщения: 40
|
Профиль | Отправить PM | Цитировать Но так как других нет, то для наглядности лучше забить свою. Много усилий это не займет.
|
Отправлено: 12:01, 24-08-2012 | #9 |
Пользователь Сообщения: 108
|
Профиль | Отправить PM | Цитировать Цитата AlexVol:
|
|
Отправлено: 21:22, 25-08-2012 | #10 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Конвертирование MKV | Den47 | Видео и аудио: обработка и кодирование | 2 | 29-06-2008 22:54 | |
Теория - Конвертирование xls в jpg | Surround | Программирование и базы данных | 13 | 27-01-2008 17:50 | |
Конвертирование вэб страниц | Noel | Вебмастеру | 2 | 03-04-2007 01:37 | |
Конвертирование FAT32 в NTFS | Uber | Microsoft Windows 2000/XP | 2 | 27-03-2007 21:33 | |
Конвертирование баз данных | han | Программирование и базы данных | 2 | 08-12-2005 00:30 |
|