Форум: "Начинающим";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
ВнизВремя из секунд к "человеческому" виду. Найти похожие ветки
← →
SmallEr (2007-04-28 18:53) [0]Есть такая задача, дано время в секндах (что бы не думали что там 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 с
Я так думаю, что с такой задачей уже кто-то умнее меня сталкивался и видели или знают хорошее решение. ?
← →
Anatoly Podgoretsky © (2007-04-28 19:00) [1]> SmallEr (28.04.2007 18:53:00) [0]
Сколько дней в месяце?
← →
Ketmar © (2007-04-28 19:29) [2]FormatDate?
← →
palva © (2007-04-28 19:37) [3]В сутки можно перевести, а дальше никак.
← →
Asail (2007-04-28 19:38) [4]
> Я так думаю, что с такой задачей уже кто-то умнее меня сталкивался
> и видели или знают хорошее решение. ?
Нету такого... В смысле, смотри [1]...
← →
Desdechado © (2007-04-28 19:39) [5]
> а дальше никак.
Можно и дальше, типа "приблизительно 2 года 3 месяца и 19 секунд" :))
← →
Asail (2007-04-28 19:42) [6]
> Можно и дальше, типа "приблизительно 2 года 3 месяца и 19
> секунд" :))
Ни фига себе приблизительно... Т.е. 19 сек и ошибка на сутки - это нормально? Тогда уж, "приблизительно 2 года 3 месяца" и Бог с ними, с секундами...
← →
Ketmar © (2007-04-28 20:18) [7]а что, DecodeDateTime() (или как её там) -- не декодит? перевести секунды в TDateTime -- не проблема. дальше взял -- и ручками сложил себе строку.
← →
Asail (2007-04-28 22:14) [8]
> а что, DecodeDateTime() (или как её там) -- не декодит?
> перевести секунды в TDateTime -- не проблема. дальше взял
> -- и ручками сложил себе строку.
Ну, вот тебе пример:var
DT : TDateTime;
begin
DT := 62.3453;
end;
Ну-ка скажи сколько это месяцев, дней, часов, минут и секунд (особенно месяцев).
DecodeDateTime декодит временную точку а не отрезок.
← →
Ketmar © (2007-04-28 22:35) [9]мда. ступил, каюсь.
← →
Anatoly Podgoretsky © (2007-04-28 23:26) [10]> Asail (28.04.2007 19:42:06) [6]
Тогда надо дальше, приблизительно два года
← →
Anatoly Podgoretsky © (2007-04-28 23:28) [11]> Asail (28.04.2007 22:14:08) [8]
Никаких проблем, ровно, а не приблизительно - два месяца, вот если бы предложил 61.3453, то я бы задумался, а вот если бы спросил про дней, то сразу бы повесился, я что идиот решать не решаемую задачу.
← →
antonn © (2007-04-28 23:42) [12]дней случайно не 61 "и еще немножко" ?
← →
Asail (2007-04-29 00:10) [13]
> Никаких проблем, ровно, а не приблизительно - два месяца
Это если считать что в месяце 31 день, а не 30, 29 и 28 (что тоже иногда случается)
← →
Германн © (2007-04-29 00:25) [14]
> Я так думаю, что с такой задачей уже кто-то умнее меня сталкивался
> и видели или знают хорошее решение. ?
Ага. Я решал такую задачу не далее как ~2 недели назад. Делал "бредовую" программу для демонстрации на выставке "бредовой" идеи. В ТЗ было что-то типа "в статусной строке вывести время, которое проработала программа в минутах и секундах". Вывел в днях, минутах и секундах. Поругался с автором ТЗ (правда по другому поводу, но и мой "вывод количества дней" тоже был упомянут). Но на месяцы, годы, столетия, тысячелетия я не замахивался. Я не волшебник, я только учусь! :)
← →
Ketmar © (2007-04-29 00:29) [15]кстати, я с устатку не сразу сообразил. а ответ на вопрос [1] таки будет?
и вообще: а какой смысл в этой задаче? подобным образом всё равно меряют промежутки времени. "начато тогда-то, закончилось тогда-то, длилось столько-то". без начальной точки отсчёта вопрос бессмысленен и ответа не имеет.
← →
Германн © (2007-04-29 00:38) [16]
> Ketmar © (29.04.07 00:29) [15]
>
> кстати, я с устатку не сразу сообразил. а ответ на вопрос
> [1] таки будет?
>
Есс-но нет. Поскольку такого ответа быть не может.
> и вообще: а какой смысл в этой задаче? подобным образом
> всё равно меряют промежутки времени. "начато тогда-то, закончилось
> тогда-то, длилось столько-то". без начальной точки отсчёта
> вопрос бессмысленен и ответа не имеет.
Ну так это ты так думаешь. А есть и иные, увы. Эти иные хотят чтобы их желания выполнялись. Но где взять волшебную палочку, или где выловить золотую рыбку, ну или хотя бы "говорящую" щуку? :-)
Ещё один бред. (Я имею в виду сабж). Достали!
← →
Malik © (2007-04-29 00:54) [17]Можно решить задачу, если только так:
секунда/минута/час/день/неделя/4-х летие/век/тысячелените/....
← →
Германн © (2007-04-29 01:05) [18]
> Malik © (29.04.07 00:54) [17]
>
> Можно решить задачу, если только так:
> секунда/минута/час/день/неделя/4-х летие/век/тысячелените/.
> ...
>
Если исходная точка задана, то да. Можно. Т.е. если речь идёт о количестве секунд прошедших после заданного момента времени, то да. Но и то очень не просто. Придётся помучиться. Но в противном случае - нет! Никогда!
← →
Ketmar © (2007-04-29 01:13) [19]> Германн © (29.04.07 00:38) [16]
> Ну так это ты так думаешь. А есть и иные, увы. Эти иные
> хотят чтобы их желания выполнялись.
в сад. вместе с такими желаниями. а лучше -- в школу, ибо явно недоучились.
← →
Германн © (2007-04-29 01:20) [20]
> Ketmar © (29.04.07 01:13) [19]
>
> > Германн © (29.04.07 00:38) [16]
> > Ну так это ты так думаешь. А есть и иные, увы. Эти иные
> > хотят чтобы их желания выполнялись.
> в сад. вместе с такими желаниями. а лучше -- в школу, ибо
> явно недоучились.
>
Ну для тебя, может и сойдёт такой способ. Ты же - вольная птица, да и семьи (за которую ты отвечаешь) у тебя нет!
P.S. Если я не прав, то ткни меня носом!
← →
Ketmar © (2007-04-29 02:21) [21]хихик. а потому и вольная, чтобы иметь возможность так ответить. %-)
← →
KilkennyCat © (2007-04-29 07:03) [22]Вы еще забыли перевод на летнее-зимнее время.
Но на самом деле задача решаема.
1 месяц = 30,4375 суток
← →
Sam Stone © (2007-04-29 09:07) [23]Вроде тут все гораздо проще: в [0] же не сказано ХYZ секунд назад. Просто - XYZ секунд. Поэтому пользуем [22]. И с этим ничего не поделаешь, поскольку дан абсолютный промежуток времени.
А вот если бы было "назовите дату 4563 секунд назад", то тут другое дело, вообще копеечное.
← →
vovnuke © (2007-04-29 11:08) [24]Ну что вы набросились, может человек астроном и ему до ваших календарных заморочек ... :-)
← →
at © (2007-04-30 16:24) [25]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
← →
antonn © (2007-04-30 17:56) [26]
> at © (30.04.07 16:24) [25]
где месяцы и годы? :)
← →
Asail (2007-04-30 19:40) [27]
> 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] :-(.
← →
Ketmar © (2007-04-30 19:59) [28]ять. сколько раз надо повторить дятлу, что задача нерешаема, чтобы дятел осознал?
← →
turbouser © (2007-04-30 20:33) [29]Если я правильно понял, то вот:
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;
← →
turbouser © (2007-04-30 20:37) [30]
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;
← →
Asail (2007-04-30 21:36) [31]
> Если я правильно понял, то вот:
Не правильно понял.
Это сколько прошло с 31.12.1899 12:00.
Читай про дятла :-) [28]
← →
turbouser © (2007-04-30 21:45) [32]
> Asail (30.04.07 21:36) [31]
Dat := IncSecond(0,3660);
вместо 3660 надо подставить количество секунд. 120 например, как в [0].
И, кстати, это не просто сколько прошло с 31.12.1899 12:00 :)
Вместо 0 можно подставить любую дату (в разумных пределах, ессно :)
Просто надо от чего-то отталкиваться для сравнения.
Попробовать не судьба?
← →
Ketmar © (2007-04-30 21:51) [33]> Asail (30.04.07 21:36) [31]
> Читай про дятла :-) [28]
так это ты сам знаешь, а над нами просто издеваешься?! транглюкирую. %-)
> turbouser © (30.04.07 21:45) [32]
> Просто надо от чего-то отталкиваться для сравнения.
> Попробовать не судьба?
почитать ветку не судьба?
← →
Asail (2007-04-30 21:52) [34]
> Просто надо от чего-то отталкиваться для сравнения.
Не от чего отталкиваться... Задача была поставленна так: есть кол-во секунд и ВСЕ.
> Вместо 0 можно подставить любую дату (в разумных пределах,
> ессно :)
Тогда и в качестве результата можно подставить любую... В разумных пределах.
← →
Asail (2007-04-30 21:54) [35]
> так это ты сам знаешь, а над нами просто издеваешься?!
Упоси Боже!!! Просто пытаюсь объяснить тоже самое что и ты, только, по-мягче как-бы... :-)
← →
turbouser © (2007-04-30 22:06) [36]Перечитал.
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 секунд
Что именно я неправильно понял?
← →
Ketmar © (2007-04-30 22:09) [37]дятлы размножаются почкованием?
← →
{RASkov} © (2007-04-30 22:42) [38]> [36] turbouser © (30.04.07 22:06)
> Что именно я неправильно понял?
Сутки - это последнее, что можно с точностью взять из кол-ва секунд..... Вот смотри - 2592100 сек. начиная с начала этого месяца(апрель) - это 1 мес и 100 сек. а если отсчет произвести от начала следующего то результат другой. Одно и тоже кол-во секунд, а кол-во месяцев разное. Во-о блин.
← →
turbouser © (2007-04-30 22:45) [39]
> {RASkov} © (30.04.07 22:42) [38]
Понял :) Был неправ :)
← →
MsGuns © (2007-04-30 23:00) [40]Всю ветку не читал, но неужели никто не упомянул TTimeStamp, который, в общем-то и придуман был в т.ч. и для вычисления интервалов ?
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.055 c