Перевод секунд в часы...
#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 % 4 == 0 ) unix_timestamp -= 21600;
    
day = unix_timestamp / 86400;
    switch ( 
day )
    {
        
// в second будет временно хранится число месяца
        
case  0..30 : { second = day;    month = 1; }
        case  
31..58 : { second = day - 31; month = 2; }
        case  
59..89 : { second = day - 59; month = 3; }
        case 
90..119 : { second = day - 90; month = 4; }
        case 
120..150 : { second = day - 120; month = 5; }
        case 
151..180 : { second = day - 151; month = 6; }
        case 
181..211 : { second = day - 181; month = 7; }
        case 
212..242 : { second = day - 212; month = 8; }
        case 
243..272 : { second = day - 243; month = 9; }
        case 
273..303 : { second = day - 273; month = 10; }
        case 
304..333 : { second = day - 304; month = 11; }
        case 
334..366 : { second = day - 334; month = 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 = 0 )
{
    
// ------------
    
const sizeOfOutput = 128; // размер возвращаемой строки
    
new yyyy, mm, dd, h, m, s,
        
pos, foundPos, searchStartPos, outStrLen,
        
tmpNumStr[5], outStr[sizeOfOutput];
    
timestamp_to_date( timestamp, yyyy,mm,dd, h,m,s ); // превратим штамп в дату
    // ------------
    // -------------------
    // скопируем formatStr в outStr
    
memcpy( outStr, formatStr, 0, (sizeOfOutput - 1)*4 );
    
outStr[sizeOfOutput - 1] = 0; // правильный обрез строки в целях безопасности
    
outStrLen = strlen(outStr);
    
// -------------------
    // YEAR
    // -------------------
    
searchStartPos = 0; // поз начала поиска = 0
    
foundPos = strfind( outStr, "%yyyy", false, searchStartPos ); // ищем первую позицию
    
while ( foundPos != -1 )
    {
        
format( tmpNumStr, 5, "%04d", yyyy ); // tmpNumStr = строкое значение yyyy
        
for ( pos = 0; tmpNumStr[pos] != 0 && pos < 4; pos++ ) // замена псевдонима на значение
            
outStr[foundPos + pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
for ( pos += foundPos; pos < outStrLen; pos++ )
            
outStr[pos] = outStr[pos + 1];
        
outStr[pos] = 0; // правильный обрез строки
        
outStrLen = strlen(outStr); // размер строки изменился
        
searchStartPos = foundPos + 4; // позиция начала след. поиска += 4
        
if ( searchStartPos < outStrLen ) // если поз начала поиска меньше длины строки
            
foundPos = strfind( outStr, "%yyyy", false, searchStartPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // -------------------
    
searchStartPos = 0; // поз начала поиска = 0
    
foundPos = strfind( outStr, "%yy", false, searchStartPos ); // ищем первую позицию
    
while ( foundPos != -1 )
    {
        
format( tmpNumStr, 5, "%04d", yyyy ); // tmpNumStr = строкое значение yyyy
        
for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
            
outStr[foundPos + pos] = tmpNumStr[pos + 2];
        
// сдвиг назад на 1 дальнейшего контента строки
        
for ( pos += foundPos; pos <= outStrLen; pos++ )
            
outStr[pos] = outStr[pos + 1];
        
outStr[pos] = 0; // правильный обрез строки
        
outStrLen = strlen(outStr); // размер строки изменился
        
searchStartPos = foundPos + 2; // позиция начала след. поиска изменилась
        
if ( searchStartPos < outStrLen ) // если поз начала поиска меньше длины строки
            
foundPos = strfind( outStr, "%yy", false, searchStartPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // MONTH
    // -------------------
    
foundPos = 0; // поз начала поиска = 0
    
foundPos = strfind( outStr, "%mm", false, foundPos ); // ищем первую позицию
    
while ( foundPos != -1 )
    {
        
format( tmpNumStr, 3, "%02d", mm ); // tmpNumStr = строкое значение числа
        
for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
            
outStr[foundPos + pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
for ( pos += foundPos; pos <= outStrLen; pos++ )
            
outStr[pos] = outStr[pos + 1];
        
outStr[pos] = 0; // правильный обрез строки
        
outStrLen = strlen(outStr); // размер строки изменился
        
foundPos += 2; // позиция начала след. поиска изменилась
        
if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
            
foundPos = strfind( outStr, "%mm", false, foundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // -------------------
    
foundPos = 0; // поз начала поиска = 0
    
foundPos = strfind( outStr, "%m", false, foundPos ); // ищем первую позицию
    
while ( foundPos != -1 )
    {
        
format( tmpNumStr, 3, "%d", mm ); // tmpNumStr = строкое значение числа
        
for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
            
outStr[foundPos + pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
if ( mm < 10 )
        {
            for ( 
pos += foundPos; pos <= outStrLen; pos++ )
                
outStr[pos] = outStr[pos + 1];
            
outStr[pos] = 0; // правильный обрез строки
            
outStrLen = strlen(outStr); // размер строки изменился
            
foundPos++; // позиция начала след. поиска изменилась
        
}
        else
            
foundPos += 2; // позиция начала след. поиска изменилась
        
if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
            
foundPos = strfind( outStr, "%m", false, foundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // DAY
    // -------------------
    
foundPos = 0; // поз начала поиска = 0
    
foundPos = strfind( outStr, "%dd", false, foundPos ); // ищем первую позицию
    
while ( foundPos != -1 )
    {
        
format( tmpNumStr, 3, "%02d", dd ); // tmpNumStr = строкое значение числа
        
for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
            
outStr[foundPos + pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
for ( pos += foundPos; pos <= outStrLen; pos++ )
            
outStr[pos] = outStr[pos + 1];
        
outStr[pos] = 0; // правильный обрез строки
        
outStrLen = strlen(outStr); // размер строки изменился
        
foundPos += 2; // позиция начала след. поиска изменилась
        
if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
            
foundPos = strfind( outStr, "%dd", false, foundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // -------------------
    
foundPos = 0; // поз начала поиска = 0
    
foundPos = strfind( outStr, "%d", false, foundPos ); // ищем первую позицию
    
while ( foundPos != -1 )
    {
        
format( tmpNumStr, 3, "%d", dd ); // tmpNumStr = строкое значение числа
        
for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
            
outStr[foundPos + pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
if ( dd < 10 )
        {
            for ( 
pos += foundPos; pos <= outStrLen; pos++ )
                
outStr[pos] = outStr[pos + 1];
            
outStr[pos] = 0; // правильный обрез строки
            
outStrLen = strlen(outStr); // размер строки изменился
            
foundPos++; // позиция начала след. поиска изменилась
        
}
        else
            
foundPos += 2; // позиция начала след. поиска изменилась
        
if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
            
foundPos = strfind( outStr, "%d", false, foundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // HOUR
    // -------------------
    
foundPos = 0; // поз начала поиска = 0
    
foundPos = strfind( outStr, "%hh", false, foundPos ); // ищем первую позицию
    
while ( foundPos != -1 )
    {
        
format( tmpNumStr, 3, "%02d", h ); // tmpNumStr = строкое значение числа
        
for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
            
outStr[foundPos + pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
for ( pos += foundPos; pos <= outStrLen; pos++ )
            
outStr[pos] = outStr[pos + 1];
        
outStr[pos] = 0; // правильный обрез строки
        
outStrLen = strlen(outStr); // размер строки изменился
        
foundPos += 2; // позиция начала след. поиска изменилась
        
if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
            
foundPos = strfind( outStr, "%hh", false, foundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // -------------------
    
foundPos = 0; // поз начала поиска = 0
    
foundPos = strfind( outStr, "%h", false, foundPos ); // ищем первую позицию
    
while ( foundPos != -1 )
    {
        
format( tmpNumStr, 3, "%d", h ); // tmpNumStr = строкое значение числа
        
for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
            
outStr[foundPos + pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
if ( h < 10 )
        {
            for ( 
pos += foundPos; pos <= outStrLen; pos++ )
                
outStr[pos] = outStr[pos + 1];
            
outStr[pos] = 0; // правильный обрез строки
            
outStrLen = strlen(outStr); // размер строки изменился
            
foundPos++; // позиция начала след. поиска изменилась
        
}
        else
            
foundPos += 2; // позиция начала след. поиска изменилась
        
if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
            
foundPos = strfind( outStr, "%h", false, foundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // MINUTE
    // -------------------
    
foundPos = 0; // поз начала поиска = 0
    
foundPos = strfind( outStr, "%ii", false, foundPos ); // ищем первую позицию
    
while ( foundPos != -1 )
    {
        
format( tmpNumStr, 3, "%02d", m ); // tmpNumStr = строкое значение числа
        
for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
            
outStr[foundPos + pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
for ( pos += foundPos; pos <= outStrLen; pos++ )
            
outStr[pos] = outStr[pos + 1];
        
outStr[pos] = 0; // правильный обрез строки
        
outStrLen = strlen(outStr); // размер строки изменился
        
foundPos += 2; // позиция начала след. поиска изменилась
        
if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
            
foundPos = strfind( outStr, "%ii", false, foundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // -------------------
    
foundPos = 0; // поз начала поиска = 0
    
foundPos = strfind( outStr, "%i", false, foundPos ); // ищем первую позицию
    
while ( foundPos != -1 )
    {
        
format( tmpNumStr, 3, "%d", m ); // tmpNumStr = строкое значение числа
        
for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
            
outStr[foundPos + pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
if ( m < 10 )
        {
            for ( 
pos += foundPos; pos <= outStrLen; pos++ )
                
outStr[pos] = outStr[pos + 1];
            
outStr[pos] = 0; // правильный обрез строки
            
outStrLen = strlen(outStr); // размер строки изменился
            
foundPos++; // позиция начала след. поиска изменилась
        
}
        else
            
foundPos += 2; // позиция начала след. поиска изменилась
        
if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
            
foundPos = strfind( outStr, "%i", false, foundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // SECOND
    // -------------------
    
foundPos = 0; // поз начала поиска = 0
    
foundPos = strfind( outStr, "%ss", false, foundPos ); // ищем первую позицию
    
while ( foundPos != -1 )
    {
        
format( tmpNumStr, 3, "%02d", s ); // tmpNumStr = строкое значение числа
        
for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
            
outStr[foundPos + pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
for ( pos += foundPos; pos <= outStrLen; pos++ )
            
outStr[pos] = outStr[pos + 1];
        
outStr[pos] = 0; // правильный обрез строки
        
outStrLen = strlen(outStr); // размер строки изменился
        
foundPos += 2; // позиция начала след. поиска изменилась
        
if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
            
foundPos = strfind( outStr, "%ss", false, foundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    // -------------------
    
foundPos = 0; // поз начала поиска = 0
    
foundPos = strfind( outStr, "%s", false, foundPos ); // ищем первую позицию
    
while ( foundPos != -1 )
    {
        
format( tmpNumStr, 3, "%d", s ); // tmpNumStr = строкое значение числа
        
for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
            
outStr[foundPos + pos] = tmpNumStr[pos];
        
// сдвиг назад на 1 дальнейшего контента строки
        
if ( s < 10 )
        {
            for ( 
pos += foundPos; pos <= outStrLen; pos++ )
                
outStr[pos] = outStr[pos + 1];
            
outStr[pos] = 0; // правильный обрез строки
            
outStrLen = strlen(outStr); // размер строки изменился
            
foundPos++; // позиция начала след. поиска изменилась
        
}
        else
            
foundPos += 2; // позиция начала след. поиска изменилась
        
if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
            
foundPos = strfind( outStr, "%s", false, foundPos ); // продолжим поиск
        
else break; // иначе - остановим поиск и замену
    
}
    
// -------------------
    
return outStr;
} 
авось поможет
Reply
#4

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


Forum Jump:


Users browsing this thread: 1 Guest(s)