Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вывести прошедшее от события время красиво  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15425
В Delphi есть что-то готовое, что покажет, сколько лет/месяцев/дней/часов/минут прошло?

Я имею в виду формат вывода. Например, если 0 лет прошло, то чтобы "0 лет" не выводилось на экран, а просто месяцев/дней/часов/минут.
Нужно красиво выводить uptime сервера.
И не очень хорошо смотрится что-то типа: "прошло 0 лет 0 месяцев 1 дней 0 часов 1 минута".
Куда красивей что-то типа: 1 д 5:32 или 2 мес 15 д 23:18. Ну или как там общепринято выводить uptime сервера?

К сообщению приложен файл. Размер - 19Kb
12 окт 21, 15:29    [22382692]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15425
пока вот сам написал, просто в днях показываю, ьбудет например, 733 дн, 23:12
function TUniServerModule.GetServerUptime: String;
Var
 AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond, db: Word;

 r: string;
 fs: TFormatSettings;
begin
  DecodeDateTime(Now - StartTime, AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond);

  db := DaysBetween(Now, StartTime);

  r := db.ToString + ' дн.';

  result := r + ', ' + AHour.ToString + fs.TimeSeparator + AMinute.ToString + ', start: ' + DateTimeToStr(StartTime);
end;


Сообщение было отредактировано: 12 окт 21, 15:24
12 окт 21, 15:34    [22382697]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
Result := TTimeSpan.Subtract(Now, StartTime).ToString
12 окт 21, 15:43    [22382700]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15425
и снова Find unit ничего не знает про свои библиотеки

в справке нашел System.TimeSpan

Сообщение было отредактировано: 12 окт 21, 15:40
12 окт 21, 15:51    [22382705]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15425
а как убрать миллисекунды?
просто обрезать?

К сообщению приложен файл. Размер - 4Kb
12 окт 21, 15:54    [22382707]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
rgreat
Member

Откуда:
Сообщений: 7024
X11,

Открой для себя FormatDateTime.
12 окт 21, 15:58    [22382709]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15425
я боюсь, она будет выводить "0 лет"
12 окт 21, 16:01    [22382711]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15425
аааа, вместо ToString ?
12 окт 21, 16:02    [22382712]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
rgreat
Member

Откуда:
Сообщений: 7024
В этом духе.

    if trunc(T)>0 then begin
      Result:=trunc(T*24).ToString+FormatDateTime(' ч nn м',T));
    end else begin
      Result:=FormatDateTime('hh ч nn м',T));
    end;
12 окт 21, 16:05    [22382714]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
Aniskin
Member

Откуда:
Сообщений: 341
Есть еще StrFromTimeInterval из WinApi.
12 окт 21, 16:09    [22382718]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15425
Aniskin,

спасибо, но WinApi не подходит мне
12 окт 21, 16:13    [22382720]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15425
  
var
 ts: TTimeSpan;
begin
 ts := TTimeSpan.Subtract(Now, EncodeDateTime(2017, 5, 30, 12, 55, 20, 555));
result := 'uptime: ' + ts.Days.ToString + ' дн ' + ts.Hours.ToString + ' ч ' + ts.Minutes.ToString + ' мин';


вроде норм
пусть будет пока так
12 окт 21, 16:33    [22382730]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 985
X11
  
var
 ts: TTimeSpan;
begin
 ts := TTimeSpan.Subtract(Now, EncodeDateTime(2017, 5, 30, 12, 55, 20, 555));
result := 'uptime: ' + ts.Days.ToString + ' дн ' + ts.Hours.ToString + ' ч ' + ts.Minutes.ToString + ' мин';


вроде норм
пусть будет пока так


То есть таки будет "0 дн" ?
12 окт 21, 18:56    [22382802]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 985
const
  // Шаблоны для представления интервалов в удобоваримом виде
  RightNowLbl = 'меньше минуты';
  MinsPatt = '%d мин';
  HoursMinsPatt = '%d ч %.2d мин';
  DaysHoursMinsPatt = '%d д ' + HoursMinsPatt;

// Форматирует количество минут, прошедших с момента AFrom до момента ATo.
// Если AFrom нулевое - возвращает "Нет" (процесс не был начат)
function FormatMinutesSince(AFrom, ATo: TDateTime): string;
var Mins: Integer;
begin
  if AFrom = 0 then Exit(NoneLbl);
  Mins := Abs(MinutesSince(AFrom, ATo));
  case Mins of
    0:
      Result := RightNowLbl;
    1..MinsPerHour-1:
      Result := Format(MinsPatt, [Mins]);
    MinsPerHour..MinsPerDay-1:
      Result := Format(HoursMinsPatt, [Mins div MinsPerHour, Mins mod MinsPerHour])
    else
      Result := Format(DaysHoursMinsPatt, [Mins div MinsPerDay, (Mins mod MinsPerDay) div MinsPerHour, Mins mod MinsPerHour]);
  end;
end;
12 окт 21, 18:58    [22382804]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15425
function GetServerUptime: String;
Var
 ts: TTimeSpan;
begin
  ts := TTimeSpan.Subtract(Now, StartTime);

  result := 'uptime: ' + ifthen(ts.Days > 0, ts.Days.ToString + ' дн ', '') +
                           ifthen(ts.Hours > 0, ts.Hours.ToString + ' ч ', '') +
                           ifthen(ts.Minutes > 0, ts.Minutes.ToString + ' мин', 'меньше минуты');
end;
13 окт 21, 12:51    [22383097]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
alekcvp
Member

Откуда:
Сообщений: 2916
X11,

26:00 -> "1 дн 2 ч меньше минуты"?..

Сообщение было отредактировано: 13 окт 21, 19:31
13 окт 21, 19:42    [22383318]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
X11
ifthen
Ты же знаешь, что все аргументы вычисляются до вызова функции?
14 окт 21, 13:39    [22383626]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15425
не понял, в чем проблема с аргументами?
14 окт 21, 14:06    [22383647]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2657
alekcvp,

14 окт 21, 14:14    [22383651]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
x1ca4064
Member

Откуда:
Сообщений: 1356
_Vasilisk_
X11
ifthen
Ты же знаешь, что все аргументы вычисляются до вызова функции?


С ifthen есть тонкий момент: начиная с какой-то версии Дельфи, функция объявлена как inline, что должно приводить к корректности такого кода:
  ifthen(x=0,0,100 div x)


Сейчас не помню, но на каком-то трансляторе (D10 или FPC) это работало.
14 окт 21, 14:27    [22383668]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5302
x1ca4064
С ifthen есть тонкий момент: начиная с какой-то версии Дельфи, функция объявлена как inline, что должно приводить к корректности такого кода

Это сработает только если первый аргумент константный. Но в этом случае никакой ifthen не нужен.

Сообщение было отредактировано: 14 окт 21, 15:02
14 окт 21, 15:09    [22383702]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2548
x1ca4064,

Забавно, но на практике - слабо применимо. Так уже не работает

N = ifthen(MyList=nil, 0, MyList.Count);


Выглядит скорее как ошибка кодогенерации, чем реально полезная фича.
14 окт 21, 15:44    [22383738]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3954
по-хорошему то из IfThen полноценный тернар бы запилили. было бы всем удобнее
14 окт 21, 16:24    [22383773]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
defecator
Member

Откуда:
Сообщений: 39862
makhaon
по-хорошему то из IfThen полноценный тернар бы запилили. было бы всем удобнее

+100500
поддерживаю !
14 окт 21, 19:38    [22383876]     Ответить | Цитировать Сообщить модератору
 Re: Вывести прошедшее от события время красиво  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15425
Почему-то дни не показывает, т.е. получается, что ts.Days всегда возвращает меньше 0.

function TUniServerModule.GetServerUptime: String;
Var
 ts: TTimeSpan;
begin
// время работы сервера без перезагрузки
  ts := TTimeSpan.Subtract(Now, StartTime);

  result := '<i class="fas fa-clock"></i> ' + constUptimeServer + ' ' + ifthen(ts.Days > 0, ts.Days.ToString + ' ' + constUptimeDays + ' ', '') +
                           ifthen(ts.Hours > 0, ts.Hours.ToString + ' ' + constUptimeHours + ' ', '') +
                           ifthen(ts.Minutes > 0, ts.Minutes.ToString + ' ' + constUptimeMinutes, constUptimeMin);
end;


Сервер работает уже несколько дней. А функция сейчас показывает 23 часа 3 мин.
25 ноя 21, 11:45    [22400600]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить