![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Время из секунд к "человеческому" виду.
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]Ну что вы набросились, может человек астроном и ему до ваших календарных заморочек ... :-)