Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Время из секунд к "человеческому" виду.


Страницы:   1 2 3

SmallEr ©   (2007-04-28 18:53:00) 

Есть такая задача, дано время в секндах (что бы не думали что там 120 секунд, скажу, что много там в секундах, например месяц с лишним в секундах и более) и хочется мне его перевести в "человеческо-временной облик".

Т.е. что бы расшифровывалось это всё время в секундах к например:
- 1 день 2 часа 5 минут 3 секунды
- 2 дня 12 часов 9 минут 12 секунд
- 1 месяц 10 дней 9 часов 2 секунды
- 2 года 10 месяцев 5 дней 4 часа 59 минут 25 секунд

Отлично было бы если и день/дня, месяц/месяцев тоже соответствовали нужной формулировке. Но думаю, что можно ограничится:

1 д, 2 ч, 5 м, 3 с
2 д, 12 ч, 9 м, 12 с
1 м, 10 д, 9 с, 2 с

Я так думаю, что с такой задачей уже кто-то умнее меня сталкивался и видели или знают хорошее решение. ?


antonn   (2007-05-01 10:20:00) [1]

а он возьмет и объяснит %)


Германн   (2007-04-30 23:52:00) [2]


> Ketmar ©   (30.04.07 23:04) [41]
>
> > MsGuns © (30.04.07 23:00) [40]
> ещё +1 дятел.
>

Дятел-чукча :-)


Ketmar   (2007-04-30 23:04:00) [3]

> MsGuns © (30.04.07 23:00) [40]
ещё +1 дятел.


MsGuns   (2007-04-30 23:00:00) [4]

Всю ветку не читал, но неужели никто не упомянул TTimeStamp, который, в общем-то и придуман был в т.ч. и для вычисления интервалов ?


turbouser   (2007-04-30 22:45:00) [5]


> {RASkov} ©   (30.04.07 22:42) [38]

Понял :) Был неправ :)


{RASkov}   (2007-04-30 22:42:00) [6]

> [36] turbouser ©   (30.04.07 22:06)
> Что именно я неправильно понял?

Сутки - это последнее, что можно с точностью взять из кол-ва секунд..... Вот смотри - 2592100 сек. начиная с начала этого месяца(апрель) - это 1 мес и 100 сек. а если отсчет произвести от начала следующего то результат другой. Одно и тоже кол-во секунд, а кол-во месяцев разное. Во-о блин.


Ketmar   (2007-04-30 22:09:00) [7]

дятлы размножаются почкованием?


turbouser   (2007-04-30 22:06:00) [8]

Перечитал.

function SecondsForHuman(Seconds: integer): string;
var
 Dat: TDateTime;
 Y, Mo, D, H, M, S: word;
begin
 Dat    := IncSecond(0, Seconds);
 Y      := YearsBetween(0, Dat);
 Dat    := IncYear(Dat, -Y);
 Mo     := MonthsBetween(0, Dat);
 Dat    := IncMonth(Dat, -Mo);
 D      := DaysBetween(0, Dat);
 Dat    := IncDay(Dat, -D);
 H      := HoursBetween(0, Dat);
 Dat    := IncHour(Dat, -H);
 M      := MinutesBetween(0, Dat);
 Dat    := IncMinute(Dat, -M);
 S      := SecondsBetween(0, Dat);
 Result :=
   Format('%d лет,%d месяцев, %d дней, %d часов, %d минут, %d секунд',
   [Y, Mo, D, H, M, S]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage(SecondsForHuman(121));
end;

Результат : 0 лет,0 месяцев, 0 дней, 0 часов, 2 минут, 1 секунд
Что именно я неправильно понял?


Asail   (2007-04-30 21:54:00) [9]


> так это ты сам знаешь, а над нами просто издеваешься?!

Упоси Боже!!! Просто пытаюсь объяснить тоже самое что и ты, только, по-мягче как-бы... :-)


Asail   (2007-04-30 21:52:00) [10]


> Просто надо от чего-то отталкиваться для сравнения.

Не от чего отталкиваться... Задача была поставленна так: есть кол-во секунд и ВСЕ.

> Вместо 0 можно подставить любую дату (в разумных пределах,
>  ессно :)

Тогда и в качестве результата можно подставить любую... В разумных пределах.


Ketmar   (2007-04-30 21:51:00) [11]

> Asail (30.04.07 21:36) [31]
> Читай про дятла :-) [28]

так это ты сам знаешь, а над нами просто издеваешься?! транглюкирую. %-)

> turbouser © (30.04.07 21:45) [32]
> Просто надо от чего-то отталкиваться для сравнения.
> Попробовать не судьба?

почитать ветку не судьба?


turbouser   (2007-04-30 21:45:00) [12]


> Asail   (30.04.07 21:36) [31]

Dat := IncSecond(0,3660);
вместо 3660 надо подставить количество секунд. 120 например, как в [0].
И, кстати, это не просто сколько прошло с 31.12.1899 12:00 :)
Вместо 0 можно подставить любую дату (в разумных пределах, ессно :)
Просто надо от чего-то отталкиваться для сравнения.
Попробовать не судьба?


Asail   (2007-04-30 21:36:00) [13]


> Если я правильно понял, то вот:

Не правильно понял.
Это сколько прошло с 31.12.1899 12:00.
Читай про дятла :-) [28]


turbouser   (2007-04-30 20:37:00) [14]

var
 Dat: TDateTime;
 Y, Mo, D, H, M: word;
begin
 Dat := IncSecond(0,3660);
 Y   := YearsBetween(0, Dat);
 Dat := IncYear(Dat, -Y);
 Mo  := MonthsBetween(0, Dat);
 Dat := IncMonth(Dat, -Mo);
 D   := DaysBetween(0, Dat);
 Dat := IncDay(Dat, -D);
 H   := HoursBetween(0, Dat);
 Dat := IncHour(Dat, -H);
 M   := MinutesBetween(0, Dat);
 ShowMessage(
   Format('%d лет,%d месяцев, %d дней, %d часов, %d минут',
   [Y, Mo, D, H, M]));
end;


turbouser   (2007-04-30 20:33:00) [15]

Если я правильно понял, то вот:

uses dateutils;
var
 Dat: TDateTime;
 Y, Mo, D, H, M: word;
begin
 Dat := IncSecond(0,3660);
 Y   := YearsBetween(0, Dat);
 Dat := IncYear(Dat, -YearsBetween(0, Dat));
 Mo  := MonthsBetween(0, Dat);
 Dat := IncMonth(Dat, -MonthsBetween(0, Dat));
 D   := DaysBetween(0, Dat);
 Dat := IncDay(Dat, -DaysBetween(0, Dat));
 H   := HoursBetween(0, Dat);
 Dat := IncHour(Dat, -HoursBetween(0, Dat));
 M   := MinutesBetween(0, Dat);
 ShowMessage(
   Format('%d лет,%d месяцев, %d дней, %d часов, %d минут',
   [Y, Mo, D, H, M]));
end;


Ketmar   (2007-04-30 19:59:00) [16]

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


Asail   (2007-04-30 19:40:00) [17]


> at ©   (30.04.07 16:24) [25]

А вот еще проще:

Str := IntToStr(Sec div (60*60*24)) + ' days ' + FormatDateTime('HH:nn:ss', Sec / (60*60*24));

Где Sec - исходное кол-во секунд.

Только вопрос это не решает, как справедливо замечено в [26] :-(.


antonn   (2007-04-30 17:56:00) [18]


> at ©   (30.04.07 16:24) [25]

где месяцы и годы? :)


at   (2007-04-30 16:24:00) [19]

Here'a a simple function to convert an "amount" of seconds to HH:MM:SS string.

~~~~~~~~~~~~~~~~~~~~~~~~~
function SecToTime(Sec: Integer): string;
var
  H, M, S: string;
  ZH, ZM, ZS: Integer;
begin
  ZH := Sec div 3600;
  ZM := Sec div 60 - ZH * 60;
  ZS := Sec - (ZH * 3600 + ZM * 60) ;
  H := IntToStr(ZH) ;
  M := IntToStr(ZM) ;
  S := IntToStr(ZS) ;
  Result := H + ':' + M + ':' + S;
end;

http://delphi.about.com/cs/adptips2003/a/bltip0403_5.htm


vovnuke   (2007-04-29 11:08:00) [20]

Ну что вы набросились, может человек астроном и ему до ваших календарных заморочек ... :-)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо