Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.041 c
15-1176238641
Суслик
2007-04-11 00:57
2007.05.20
И снова хелперы :)


2-1178265916
newby
2007-05-04 12:05
2007.05.20
Как записать значение в запароленную ячейку Excel?


15-1176885549
DVM
2007-04-18 12:39
2007.05.20
Как будет по английски Ведущий разработчик? Как говорят?


2-1175851104
TIF
2007-04-06 13:18
2007.05.20
PageContol + WebBrowser


15-1176918999
Kolan
2007-04-18 21:56
2007.05.20
Поменять ли видюху 6600 на 7100?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский