Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.20;
Скачать: CL | DM;

Вниз

Время из секунд к "человеческому" виду.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.056 c
3-1172862873
ПоШЛяК
2007-03-02 22:14
2007.05.20
Копирование записей


15-1176885141
Карелин Артем
2007-04-18 12:32
2007.05.20
Вода из водопровода vs вода из бутыли.


1-1174637714
tytus
2007-03-23 11:15
2007.05.20
Запущенное приложение и панель задач.


6-1163694731
Tiberius
2006-11-16 19:32
2007.05.20
Текст из браузера


2-1177690564
defiler
2007-04-27 20:16
2007.05.20
Что-то с типами наверное...