powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вывести прошедшее от события время красиво
25 сообщений из 31, страница 1 из 2
Вывести прошедшее от события время красиво
    #40103824
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Delphi есть что-то готовое, что покажет, сколько лет/месяцев/дней/часов/минут прошло?

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

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

Открой для себя FormatDateTime.
...
Рейтинг: 0 / 0
Вывести прошедшее от события время красиво
    #40103837
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я боюсь, она будет выводить "0 лет"
...
Рейтинг: 0 / 0
Вывести прошедшее от события время красиво
    #40103838
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аааа, вместо ToString ?
...
Рейтинг: 0 / 0
Вывести прошедшее от события время красиво
    #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
Вывести прошедшее от события время красиво
    #40103844
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть еще StrFromTimeInterval из WinApi.
...
Рейтинг: 0 / 0
Вывести прошедшее от события время красиво
    #40103845
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aniskin,

спасибо, но WinApi не подходит мне
...
Рейтинг: 0 / 0
Вывести прошедшее от события время красиво
    #40103851
Фотография 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
Вывести прошедшее от события время красиво
    #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
Вывести прошедшее от события время красиво
    #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
Вывести прошедшее от события время красиво
    #40104085
Фотография 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
Вывести прошедшее от события время красиво
    #40104211
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

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

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

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


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



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

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

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

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



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

+100500
поддерживаю !
...
Рейтинг: 0 / 0
Вывести прошедшее от события время красиво
    #40114796
Фотография 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
25 сообщений из 31, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вывести прошедшее от события время красиво
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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