Перевод секунд в часы...
#1

Здравствуйте
Мне необходимо было написать функцию, которая переводит секунды в строку вида:
"%d дней, %d часов, %d минут, %d секунд"
Вот моя версия:
Код:
stock GetTimeString(seconds)
{
new day, hour, minute;
new str[128];

day = seconds/86400; seconds -= day*86400;
hour = seconds/3600; seconds -= hour*3600;
minute = seconds/60; seconds -= minute*60;

format(str,sizeof(str),"%d дней, %d часов, %d минут, %d секунд",day,hour,minute,seconds);
return str;
}
Скажите пожалуйста, как ее можно оптимизировать?
И будет ли правильно заменить
seconds -= day*86400; на seconds = seconds%86400;
seconds -= hour*3600; на seconds = seconds%3600;
seconds -= minute*60; на seconds = seconds%60;
Reply
#2

pawn Код:
GetFullTime( Time )// Ym[0]n's Code
{
    new
       Seconds = Time % 60,
        Minuts = floatround( (float(Time) / 60.0), floatround_floor),
        Hours = floatround( (float(Minuts) / 60.0), floatround_floor),
        string[56];

    format(string, 54, "%d:%02d:%02d", Hours, Minuts % 60, Seconds);
    return string;
}
С другими разберёшься, я думаю =)
Reply
#3

просто конверт
PHP код:
/*
    Возвращает по ссылке дату в соответствии с указанным UNIX TIMESTAMP.
    ПОДРОБНЕЕ
        UNIX TIMESTAMP это кол-во секунд со дня 01.01.1970, 00:00:00 до
        указанной в параметрах даты. Если он правильно указан, то в
        year будет помещен год, в month - месяц, в day - день,
        в hour - час, в minute - минута, в second - секунда.
    ВЕРНЕТ
        ничего
*/
stock timestamp_to_date
(
    
unix_timestamp 0,
    & 
year 1970,        & month 1,        & day  1,
    & 
hour =  0,        & minute 0,        & second 0
)
{
    
year unix_timestamp 31557600;
    
unix_timestamp -= year 31557600;
    
year += 1970;
    if ( 
year == unix_timestamp -= 21600;
    
day unix_timestamp 86400;
    switch ( 
day )
    {
        
// в second будет временно хранится число месяца
        
case  0..30 : { second day;    month 1; }
        case  
31..58 : { second day 31month 2; }
        case  
59..89 : { second day 59month 3; }
        case 
90..119 : { second day 90month 4; }
        case 
120..150 : { second day 120month 5; }
        case 
151..180 : { second day 151month 6; }
        case 
181..211 : { second day 181month 7; }
        case 
212..242 : { second day 212month 8; }
        case 
243..272 : { second day 243month 9; }
        case 
273..303 : { second day 273month 10; }
        case 
304..333 : { second day 304month 11; }
        case 
334..366 : { second day 334month 12; }
    }
    
unix_timestamp -= day 86400;
    
hour unix_timestamp 3600;
    
unix_timestamp -= hour 3600;
    
minute unix_timestamp 60;
    
unix_timestamp -= minute 60;
    
day second 1;
    
second unix_timestamp;

конверт с форматированием
PHP код:
/*
    Заменяет в указанной строке условные обозначения времени на их значения
    в соответствии с указанным UNIX TIMESTAMP
    ПОДРОБНЕЕ
        UNIX TIMESTAMP это кол-во секунд со дня 01.01.1970, 00:00:00 до
        указанной в параметрах даты. Если он правильно указан, то в
        строке format все условные обозначения времени будут заменены
        на их значения в соответствии с указанным UNIX TIMESTAMP.
        Функция ищет:    Заменяет на:
        %yyyy            четырехзначное значение года
        %yy            двузначное значение года с ведущим нулём
        %m            значение месяца
        %mm            значение месяца с ведущим нулём
        %d            значение дня
        %dd            значение дня с ведущим нулём
        %h            значение часа
        %hh            значение часа с ведущим нулём
        %i            значение минуты
        %ii            значение минуты с ведущим нулём
        %s            значение секунды
        %ss            значение секунды с ведущим нулём
    ВЕРНЕТ
        строку с численными значениями даты вместо их псевдонимов
        размер строки = sizeOfOutput
*/
stock date formatStr "%dd.%mm.%yyyy, %hh:%ii:%ss"timestamp )
{
    
// ------------
    
const sizeOfOutput 128// размер возвращаемой строки
    
new yyyymmddhms,
        
posfoundPossearchStartPosoutStrLen,
        
tmpNumStr[5], outStr[sizeOfOutput];
    
timestamp_to_datetimestampyyyy,mm,ddh,m,); // превратим штамп в дату
    // ------------
    // -------------------
    // скопируем formatStr в outStr
    
memcpyoutStrformatStr0, (sizeOfOutput 1)*);
    
outStr[sizeOfOutput 1] = 0// правильный обрез строки в целях безопасности
    
outStrLen strlen(outStr);
    
// -------------------
    // YEAR
    // -------------------
    
searchStartPos 0// поз начала поиска = 0
    
foundPos strfindoutStr"%yyyy"falsesearchStartPos ); // ищем первую позицию
    
while ( foundPos != -)
    {
        
formattmpNumStr5"%04d"yyyy ); // tmpNumStr = строкое значение yyyy
        
for ( pos 0tmpNumStr[pos] != && pos 4pos++ ) // замена псевдонима на значение
            
outStr[foundPos pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
for ( pos += foundPospos outStrLenpos++ )
            
outStr[pos] = outStr[pos 1];
        
outStr[pos] = 0// правильный обрез строки
        
outStrLen strlen(outStr); // размер строки изменился
        
searchStartPos foundPos 4// позиция начала след. поиска += 4
        
if ( searchStartPos outStrLen // если поз начала поиска меньше длины строки
            
foundPos strfindoutStr"%yyyy"falsesearchStartPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // -------------------
    
searchStartPos 0// поз начала поиска = 0
    
foundPos strfindoutStr"%yy"falsesearchStartPos ); // ищем первую позицию
    
while ( foundPos != -)
    {
        
formattmpNumStr5"%04d"yyyy ); // tmpNumStr = строкое значение yyyy
        
for ( pos 0tmpNumStr[pos] != && pos 2pos++ ) // замена псевдонима на значение
            
outStr[foundPos pos] = tmpNumStr[pos 2];
        
// сдвиг назад на 1 дальнейшего контента строки
        
for ( pos += foundPospos <= outStrLenpos++ )
            
outStr[pos] = outStr[pos 1];
        
outStr[pos] = 0// правильный обрез строки
        
outStrLen strlen(outStr); // размер строки изменился
        
searchStartPos foundPos 2// позиция начала след. поиска изменилась
        
if ( searchStartPos outStrLen // если поз начала поиска меньше длины строки
            
foundPos strfindoutStr"%yy"falsesearchStartPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // MONTH
    // -------------------
    
foundPos 0// поз начала поиска = 0
    
foundPos strfindoutStr"%mm"falsefoundPos ); // ищем первую позицию
    
while ( foundPos != -)
    {
        
formattmpNumStr3"%02d"mm ); // tmpNumStr = строкое значение числа
        
for ( pos 0tmpNumStr[pos] != && pos 2pos++ ) // замена псевдонима на значение
            
outStr[foundPos pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
for ( pos += foundPospos <= outStrLenpos++ )
            
outStr[pos] = outStr[pos 1];
        
outStr[pos] = 0// правильный обрез строки
        
outStrLen strlen(outStr); // размер строки изменился
        
foundPos += 2// позиция начала след. поиска изменилась
        
if ( foundPos outStrLen // если поз начала поиска меньше длины строки
            
foundPos strfindoutStr"%mm"falsefoundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // -------------------
    
foundPos 0// поз начала поиска = 0
    
foundPos strfindoutStr"%m"falsefoundPos ); // ищем первую позицию
    
while ( foundPos != -)
    {
        
formattmpNumStr3"%d"mm ); // tmpNumStr = строкое значение числа
        
for ( pos 0tmpNumStr[pos] != && pos 2pos++ ) // замена псевдонима на значение
            
outStr[foundPos pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
if ( mm 10 )
        {
            for ( 
pos += foundPospos <= outStrLenpos++ )
                
outStr[pos] = outStr[pos 1];
            
outStr[pos] = 0// правильный обрез строки
            
outStrLen strlen(outStr); // размер строки изменился
            
foundPos++; // позиция начала след. поиска изменилась
        
}
        else
            
foundPos += 2// позиция начала след. поиска изменилась
        
if ( foundPos outStrLen // если поз начала поиска меньше длины строки
            
foundPos strfindoutStr"%m"falsefoundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // DAY
    // -------------------
    
foundPos 0// поз начала поиска = 0
    
foundPos strfindoutStr"%dd"falsefoundPos ); // ищем первую позицию
    
while ( foundPos != -)
    {
        
formattmpNumStr3"%02d"dd ); // tmpNumStr = строкое значение числа
        
for ( pos 0tmpNumStr[pos] != && pos 2pos++ ) // замена псевдонима на значение
            
outStr[foundPos pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
for ( pos += foundPospos <= outStrLenpos++ )
            
outStr[pos] = outStr[pos 1];
        
outStr[pos] = 0// правильный обрез строки
        
outStrLen strlen(outStr); // размер строки изменился
        
foundPos += 2// позиция начала след. поиска изменилась
        
if ( foundPos outStrLen // если поз начала поиска меньше длины строки
            
foundPos strfindoutStr"%dd"falsefoundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // -------------------
    
foundPos 0// поз начала поиска = 0
    
foundPos strfindoutStr"%d"falsefoundPos ); // ищем первую позицию
    
while ( foundPos != -)
    {
        
formattmpNumStr3"%d"dd ); // tmpNumStr = строкое значение числа
        
for ( pos 0tmpNumStr[pos] != && pos 2pos++ ) // замена псевдонима на значение
            
outStr[foundPos pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
if ( dd 10 )
        {
            for ( 
pos += foundPospos <= outStrLenpos++ )
                
outStr[pos] = outStr[pos 1];
            
outStr[pos] = 0// правильный обрез строки
            
outStrLen strlen(outStr); // размер строки изменился
            
foundPos++; // позиция начала след. поиска изменилась
        
}
        else
            
foundPos += 2// позиция начала след. поиска изменилась
        
if ( foundPos outStrLen // если поз начала поиска меньше длины строки
            
foundPos strfindoutStr"%d"falsefoundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // HOUR
    // -------------------
    
foundPos 0// поз начала поиска = 0
    
foundPos strfindoutStr"%hh"falsefoundPos ); // ищем первую позицию
    
while ( foundPos != -)
    {
        
formattmpNumStr3"%02d"); // tmpNumStr = строкое значение числа
        
for ( pos 0tmpNumStr[pos] != && pos 2pos++ ) // замена псевдонима на значение
            
outStr[foundPos pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
for ( pos += foundPospos <= outStrLenpos++ )
            
outStr[pos] = outStr[pos 1];
        
outStr[pos] = 0// правильный обрез строки
        
outStrLen strlen(outStr); // размер строки изменился
        
foundPos += 2// позиция начала след. поиска изменилась
        
if ( foundPos outStrLen // если поз начала поиска меньше длины строки
            
foundPos strfindoutStr"%hh"falsefoundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // -------------------
    
foundPos 0// поз начала поиска = 0
    
foundPos strfindoutStr"%h"falsefoundPos ); // ищем первую позицию
    
while ( foundPos != -)
    {
        
formattmpNumStr3"%d"); // tmpNumStr = строкое значение числа
        
for ( pos 0tmpNumStr[pos] != && pos 2pos++ ) // замена псевдонима на значение
            
outStr[foundPos pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
if ( 10 )
        {
            for ( 
pos += foundPospos <= outStrLenpos++ )
                
outStr[pos] = outStr[pos 1];
            
outStr[pos] = 0// правильный обрез строки
            
outStrLen strlen(outStr); // размер строки изменился
            
foundPos++; // позиция начала след. поиска изменилась
        
}
        else
            
foundPos += 2// позиция начала след. поиска изменилась
        
if ( foundPos outStrLen // если поз начала поиска меньше длины строки
            
foundPos strfindoutStr"%h"falsefoundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // MINUTE
    // -------------------
    
foundPos 0// поз начала поиска = 0
    
foundPos strfindoutStr"%ii"falsefoundPos ); // ищем первую позицию
    
while ( foundPos != -)
    {
        
formattmpNumStr3"%02d"); // tmpNumStr = строкое значение числа
        
for ( pos 0tmpNumStr[pos] != && pos 2pos++ ) // замена псевдонима на значение
            
outStr[foundPos pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
for ( pos += foundPospos <= outStrLenpos++ )
            
outStr[pos] = outStr[pos 1];
        
outStr[pos] = 0// правильный обрез строки
        
outStrLen strlen(outStr); // размер строки изменился
        
foundPos += 2// позиция начала след. поиска изменилась
        
if ( foundPos outStrLen // если поз начала поиска меньше длины строки
            
foundPos strfindoutStr"%ii"falsefoundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // -------------------
    
foundPos 0// поз начала поиска = 0
    
foundPos strfindoutStr"%i"falsefoundPos ); // ищем первую позицию
    
while ( foundPos != -)
    {
        
formattmpNumStr3"%d"); // tmpNumStr = строкое значение числа
        
for ( pos 0tmpNumStr[pos] != && pos 2pos++ ) // замена псевдонима на значение
            
outStr[foundPos pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
if ( 10 )
        {
            for ( 
pos += foundPospos <= outStrLenpos++ )
                
outStr[pos] = outStr[pos 1];
            
outStr[pos] = 0// правильный обрез строки
            
outStrLen strlen(outStr); // размер строки изменился
            
foundPos++; // позиция начала след. поиска изменилась
        
}
        else
            
foundPos += 2// позиция начала след. поиска изменилась
        
if ( foundPos outStrLen // если поз начала поиска меньше длины строки
            
foundPos strfindoutStr"%i"falsefoundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // SECOND
    // -------------------
    
foundPos 0// поз начала поиска = 0
    
foundPos strfindoutStr"%ss"falsefoundPos ); // ищем первую позицию
    
while ( foundPos != -)
    {
        
formattmpNumStr3"%02d"); // tmpNumStr = строкое значение числа
        
for ( pos 0tmpNumStr[pos] != && pos 2pos++ ) // замена псевдонима на значение
            
outStr[foundPos pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
for ( pos += foundPospos <= outStrLenpos++ )
            
outStr[pos] = outStr[pos 1];
        
outStr[pos] = 0// правильный обрез строки
        
outStrLen strlen(outStr); // размер строки изменился
        
foundPos += 2// позиция начала след. поиска изменилась
        
if ( foundPos outStrLen // если поз начала поиска меньше длины строки
            
foundPos strfindoutStr"%ss"falsefoundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // -------------------
    
foundPos 0// поз начала поиска = 0
    
foundPos strfindoutStr"%s"falsefoundPos ); // ищем первую позицию
    
while ( foundPos != -)
    {
        
formattmpNumStr3"%d"); // tmpNumStr = строкое значение числа
        
for ( pos 0tmpNumStr[pos] != && pos 2pos++ ) // замена псевдонима на значение
            
outStr[foundPos pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
if ( 10 )
        {
            for ( 
pos += foundPospos <= outStrLenpos++ )
                
outStr[pos] = outStr[pos 1];
            
outStr[pos] = 0// правильный обрез строки
            
outStrLen strlen(outStr); // размер строки изменился
            
foundPos++; // позиция начала след. поиска изменилась
        
}
        else
            
foundPos += 2// позиция начала след. поиска изменилась
        
if ( foundPos outStrLen // если поз начала поиска меньше длины строки
            
foundPos strfindoutStr"%s"falsefoundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    
return outStr;

авось поможет
Reply
#4

если используешь timestamp то юзай пример мастера, если нет то юзай timestamp и пример мастера
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)