URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1446
[ Назад ]

Исходное сообщение
"Перевести время из секунд в человеческий формат"

Отправлено Asmerald , 03-Мрт-03 15:10 
Есть ли какой-нибудь модуль, который переводит количество секунд в формат "месяцы/недели/часы/минуты/секунды"?

Содержание

Сообщения в этом обсуждении
"RE: Перевести время из секунд в человеческий формат"
Отправлено XMan , 03-Мрт-03 20:58 
Смотри функцию localtime

"RE: Перевести время из секунд в человеческий формат"
Отправлено Bogerm , 04-Мрт-03 04:51 
>Есть ли какой-нибудь модуль, который переводит количество секунд в формат "месяцы/недели/часы/минуты/секунды"?

Есть: Time::localtime;

Но это не единственный способ. Проще всего использовать стандартные функции localtime, gmtime или strftime:

( $seconds, $minutes, $hours, $day, $month, $year, $wday, $yday, $isdst) = localtime($time);

или

printf("Date: d-d-d\n",
     sub {($_[5]+1900, $_[4]+1, $_[3])}->(localtime));

можно использовать её в скалярном контексте:
$string = localtime($time), тогда в строке $string будет время в "человеческом формате", например:
print scalar localtime;


"RE: Перевести время из секунд в человеческий формат"
Отправлено Asmerald , 04-Мрт-03 10:59 
>Есть: Time::localtime;
>
>Но это не единственный способ. Проще всего использовать стандартные функции localtime, gmtime
>или strftime:
>
>( $seconds, $minutes, $hours, $day, $month, $year, $wday, $yday, $isdst) = localtime($time);
>
>
>или
>
>printf("Date: d-d-d\n",
>     sub {($_[5]+1900, $_[4]+1, $_[3])}->(localtime));
>
>можно использовать её в скалярном контексте:
>$string = localtime($time), тогда в строке $string будет время в "человеческом формате",
>например:
>print scalar localtime;

Опять не то. Я наверное не так объясьнил. Что такое localtime я знаю. Задача такая: дано количество секунд, скажем 3337s надо перевести это в формат 55m37s. А не считать это временем от epoch. Я могу это и скриптом считать, но не хотелось бы изобретать велосипед, если таковой модуль уже есть.


"RE: Перевести время из секунд в человеческий формат"
Отправлено konst , 04-Мрт-03 12:39 

>если таковой модуль уже есть.

Какой модуль!!!!????
просто PRINTF
$sec = $ARGV[0];
printf("%dm%ds",int ($sec/60),$sec`);
# - минуты и секунды
# ИЛИ
printf("%dh%dm%ds",int ($sec/3600),int ($sec/60),$sec`);
# - часы, минуты и секунды


"RE: Перевести время из секунд в человеческий формат"
Отправлено Asmerald , 04-Мрт-03 12:43 
>
>>если таковой модуль уже есть.
>
>Какой модуль!!!!????
>просто PRINTF
>$sec = $ARGV[0];
>printf("%dm%ds",int ($sec/60),$sec`);
># - минуты и секунды
># ИЛИ
>printf("%dh%dm%ds",int ($sec/3600),int ($sec/60),$sec`);
># - часы, минуты и секунды

О! Это-то и интересовало. Спасибо.


"RE: Перевести время из секунд в человеческий формат"
Отправлено konst , 04-Мрт-03 12:53 
>>
>>>если таковой модуль уже есть.
>>
>>Какой модуль!!!!????
>>просто PRINTF
>>$sec = $ARGV[0];
>>printf("%dm%ds",int ($sec/60),$sec`);
>># - минуты и секунды
>># ИЛИ
>>printf("%dh%dm%ds",int ($sec/3600),int ($sec/60),$sec`);
>># - часы, минуты и секунды
>
>О! Это-то и интересовало. Спасибо.
Какой-то глюк с отображением...
printf("%dh%dm%ds",int ($sec/3600),int ($sec/60),$sec % 60`);
                                                                                ^^^^^^^^^^^^  
(для теста как отобразится:  4%5 = 4 % 5)

"RE: Перевести время из секунд в человеческий формат"
Отправлено Bogerm , 04-Мрт-03 16:03 
>>>
>>>>если таковой модуль уже есть.
>>>
>>>Какой модуль!!!!????
>>>просто PRINTF
>>>$sec = $ARGV[0];
>>>printf("%dm%ds",int ($sec/60),$sec`);
>>># - минуты и секунды
>>># ИЛИ
>>>printf("%dh%dm%ds",int ($sec/3600),int ($sec/60),$sec`);
>>># - часы, минуты и секунды
>>
>>О! Это-то и интересовало. Спасибо.
>Какой-то глюк с отображением...
>printf("%dh%dm%ds",int ($sec/3600),int ($sec/60),$sec % 60`);
>            
>          
>          
>          
>          
>          
>          
>  ^^^^^^^^^^^^
>(для теста как отобразится:  4%5 = 4 % 5)

Когда-то давно я написал вот такую функцию:

sub print_sec {
        my $num = shift;
        return sprintf("=:d.d", int($num/3600),
                                int(($num - (int($num/3600)*3600))/60),
                int($num - (int($num/60)*60)));
}

Наверное это неэффективно, но работает и мне хватало...


"RE: Перевести время из секунд в человеческий формат"
Отправлено Asmerald , 04-Мрт-03 18:04 
>Когда-то давно я написал вот такую функцию:
>
>sub print_sec {
>        my $num = shift;
>
>        return sprintf("=:d.d", int($num/3600),
>            
>          
>         int(($num -
>(int($num/3600)*3600))/60),
>            
>    int($num - (int($num/60)*60)));
>}
>
>Наверное это неэффективно, но работает и мне хватало...

Я практически так же и сделал.


"RE: Перевести время из секунд в человеческий формат"
Отправлено pth , 04-Мрт-03 16:22 
C часами, минутами и секундаии (и даже с неделями) - все прекрасно, но как быть с месяцАми?

P.S. Опять же - високосные секунды не учитываются.



"RE: Перевести время из секунд в человеческий формат"
Отправлено Asmerald , 04-Мрт-03 18:06 
>C часами, минутами и секундаии (и даже с неделями) - все прекрасно,
>но как быть с месяцАми?

Месяцев-то всего 12, можно и прописать.

>P.S. Опять же - високосные секунды не учитываются.

В моём случае это не принципиально.


"RE: Перевести время из секунд в человеческий формат"
Отправлено pth , 04-Мрт-03 18:23 
>>C часами, минутами и секундаии (и даже с неделями) - все прекрасно,
>>но как быть с месяцАми?
>
>Месяцев-то всего 12, можно и прописать

Прописать что? Число дней для каждого месяца? А как определить в каком месяце начался отсчет?

>
>>P.S. Опять же - високосные секунды не учитываются.
>
>В моём случае это не принципиально.

Ну хозяин - барин. (Хотя это была тык сыыть шутка).


"RE: Перевести время из секунд в человеческий формат"
Отправлено Asmerald , 04-Мрт-03 18:28 
>>>C часами, минутами и секундаии (и даже с неделями) - все прекрасно,
>>>но как быть с месяцАми?
>>
>>Месяцев-то всего 12, можно и прописать
>
>Прописать что? Число дней для каждого месяца? А как определить в каком
>месяце начался отсчет?

А разве нельзя прописать (1..30), (1..31), (1..28)? Определить можно, дата начала отсчёта присутствует.


"RE: Перевести время из секунд в человеческий формат"
Отправлено pth , 04-Мрт-03 18:52 
>А разве нельзя прописать (1..30), (1..31), (1..28)?

Ну да я про это же. Число дней в каждом месяце можно прописать (если високосные годины не колышат).

> Определить можно, дата начала отсчёта присутствует.

Разве? Ты же говорил, что имееешь только число секунд и это число надо перевести в месяцы/недели/часы/минуты/секунды. Где в этом числе секунд начало отсчета?


"RE: Перевести время из секунд в человеческий формат"
Отправлено Asmerald , 04-Мрт-03 18:59 
>> Определить можно, дата начала отсчёта присутствует.
>
>Разве? Ты же говорил, что имееешь только число секунд и это число
>надо перевести в месяцы/недели/часы/минуты/секунды. Где в этом числе секунд начало отсчета?
>

Ситуация такая: есть sql-база в которой, есть время подключения (естественно вплоть до секунды) и есть время в секундах, прошедших с времени подключения, т.е. время отключения отсутствует. Так вот надо показывать это время, записанное в секундах, в понимаемом обычным человеком формате.
Хотя мне уже сдаётся, что я это через одно место делаю. Слишком усложняю похоже.


"RE: Перевести время из секунд в человеческий формат"
Отправлено konst , 04-Мрт-03 19:06 
>Ситуация такая: есть sql-база в которой, есть время подключения (естественно вплоть до
>секунды) и есть время в секундах, прошедших с времени подключения, т.е.
>время отключения отсутствует. Так вот надо показывать это время, записанное в
>секундах, в понимаемом обычным человеком формате.
>Хотя мне уже сдаётся, что я это через одно место делаю. Слишком
>усложняю похоже.
Если время подкл. есть в БД => пользуйся стандартными функциями SQL
типа select to_date("Format",Current time - tab.date_of_access) from tab;
Что-нибудь в этом духе. См. функции работы с датами

"RE: Перевести время из секунд в человеческий формат"
Отправлено Asmerald , 04-Мрт-03 19:36 
>Если время подкл. есть в БД => пользуйся стандартными функциями SQL
>типа select to_date("Format",Current time - tab.date_of_access) from tab;
>Что-нибудь в этом духе. См. функции работы с датами

Посмотрел. Действительно, похоже, так гораздо проще. Спасибо за совет.