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;
}