Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вывести прошедшее от события время красиво / 25 сообщений из 31, страница 1 из 2
12.10.2021, 15:29
    #40103824
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
В Delphi есть что-то готовое, что покажет, сколько лет/месяцев/дней/часов/минут прошло?

Я имею в виду формат вывода. Например, если 0 лет прошло, то чтобы "0 лет" не выводилось на экран, а просто месяцев/дней/часов/минут.
Нужно красиво выводить uptime сервера.
И не очень хорошо смотрится что-то типа: "прошло 0 лет 0 месяцев 1 дней 0 часов 1 минута".
Куда красивей что-то типа: 1 д 5:32 или 2 мес 15 д 23:18 . Ну или как там общепринято выводить uptime сервера?
...
Рейтинг: 0 / 0
12.10.2021, 15:34
    #40103826
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
пока вот сам написал, просто в днях показываю, ьбудет например, 733 дн, 23:12
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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;
...
Рейтинг: 0 / 0
12.10.2021, 15:43
    #40103829
Maxim Rusov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
Result := TTimeSpan.Subtract(Now, StartTime).ToString
...
Рейтинг: 0 / 0
12.10.2021, 15:51
    #40103833
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
и снова Find unit ничего не знает про свои библиотеки

в справке нашел System.TimeSpan
...
Рейтинг: 0 / 0
12.10.2021, 15:54
    #40103834
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
а как убрать миллисекунды?
просто обрезать?
...
Рейтинг: 0 / 0
12.10.2021, 15:58
    #40103836
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
X11,

Открой для себя FormatDateTime.
...
Рейтинг: 0 / 0
12.10.2021, 16:01
    #40103837
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
я боюсь, она будет выводить "0 лет"
...
Рейтинг: 0 / 0
12.10.2021, 16:02
    #40103838
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
аааа, вместо ToString ?
...
Рейтинг: 0 / 0
12.10.2021, 16:05
    #40103840
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
В этом духе.

Код: pascal
1.
2.
3.
4.
5.
    if trunc(T)>0 then begin
      Result:=trunc(T*24).ToString+FormatDateTime(' ч nn м',T));
    end else begin
      Result:=FormatDateTime('hh ч nn м',T));
    end;
...
Рейтинг: 0 / 0
12.10.2021, 16:09
    #40103844
Aniskin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
Есть еще StrFromTimeInterval из WinApi.
...
Рейтинг: 0 / 0
12.10.2021, 16:13
    #40103845
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
Aniskin,

спасибо, но WinApi не подходит мне
...
Рейтинг: 0 / 0
12.10.2021, 16:33
    #40103851
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
Код: pascal
1.
2.
3.
4.
5.
6.
  
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 / 0
12.10.2021, 18:56
    #40103897
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
X11
Код: pascal
1.
2.
3.
4.
5.
6.
  
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 дн" ?
...
Рейтинг: 0 / 0
12.10.2021, 18:58
    #40103899
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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;
...
Рейтинг: 0 / 0
13.10.2021, 12:51
    #40104085
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;
...
Рейтинг: 0 / 0
13.10.2021, 19:42
    #40104211
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
X11,

26:00 -> "1 дн 2 ч меньше минуты"?..
...
Рейтинг: 0 / 0
14.10.2021, 13:39
    #40104377
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
X11
Код: pascal
1.
ifthen

Ты же знаешь, что все аргументы вычисляются до вызова функции?
...
Рейтинг: 0 / 0
14.10.2021, 14:06
    #40104391
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
не понял, в чем проблема с аргументами?
...
Рейтинг: 0 / 0
14.10.2021, 14:14
    #40104394
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
alekcvp,
...
Рейтинг: 0 / 0
14.10.2021, 14:27
    #40104405
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
_Vasilisk_
X11
Код: pascal
1.
ifthen

Ты же знаешь, что все аргументы вычисляются до вызова функции?


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



Сейчас не помню, но на каком-то трансляторе (D10 или FPC) это работало.
...
Рейтинг: 0 / 0
14.10.2021, 15:09
    #40104432
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
x1ca4064
С ifthen есть тонкий момент: начиная с какой-то версии Дельфи, функция объявлена как inline, что должно приводить к корректности такого кода

Это сработает только если первый аргумент константный. Но в этом случае никакой ifthen не нужен.
...
Рейтинг: 0 / 0
14.10.2021, 15:44
    #40104465
Maxim Rusov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
x1ca4064,

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

Код: pascal
1.
N = ifthen(MyList=nil, 0, MyList.Count);



Выглядит скорее как ошибка кодогенерации, чем реально полезная фича.
...
Рейтинг: 0 / 0
14.10.2021, 16:24
    #40104492
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
по-хорошему то из IfThen полноценный тернар бы запилили. было бы всем удобнее
...
Рейтинг: 0 / 0
14.10.2021, 19:38
    #40104549
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
makhaon
по-хорошему то из IfThen полноценный тернар бы запилили. было бы всем удобнее

+100500
поддерживаю !
...
Рейтинг: 0 / 0
25.11.2021, 11:45
    #40114796
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести прошедшее от события время красиво
Почему-то дни не показывает, т.е. получается, что ts.Days всегда возвращает меньше 0.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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 мин.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вывести прошедшее от события время красиво / 25 сообщений из 31, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]