Advertisement
Romzes

mxdate

Jun 10th, 2015
1,654
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 19.74 KB | None | 0 0
  1. /*
  2.     Возвращает UNIX TIMESTAMP в соответствии с указанной датой.
  3.  
  4.     ПОДРОБНЕЕ
  5.         UNIX TIMESTAMP это кол-во секунд со дня 01.01.1970, 00:00:00 до
  6.         указанной в параметрах даты
  7.  
  8.     ВЕРНЕТ
  9.         число integer (4 байта)
  10. */
  11. stock date_to_timestamp
  12. (
  13.     year = 1970,    month  = 1, day    = 1,
  14.     hour =    0,    minute = 0, second = 0
  15. )
  16. {
  17.     switch ( month )
  18.     {
  19.         case  2 : day +=  31;   case  3 : day +=  59;   case  4 : day +=  90;
  20.         case  5 : day += 120;   case  6 : day += 151;   case  7 : day += 181;
  21.         case  8 : day += 212;   case  9 : day += 243;   case 10 : day += 273;
  22.         case 11 : day += 304;   case 12 : day += 334;
  23.     }
  24.  
  25.     return ( second + minute*60 + hour*3600 + (day - 1)*86400
  26.         + (year - 1970)*31557600 + ( year % 4 == 0 ? 21600 : 0 ) );
  27. }
  28.  
  29.  
  30. /*
  31.     Возвращает по ссылке дату в соответствии с указанным UNIX TIMESTAMP.
  32.  
  33.     ПОДРОБНЕЕ
  34.         UNIX TIMESTAMP это кол-во секунд со дня 01.01.1970, 00:00:00 до
  35.         указанной в параметрах даты. Если он правильно указан, то в
  36.         year будет помещен год, в month - месяц, в day - день,
  37.         в hour - час, в minute - минута, в second - секунда.
  38.  
  39.     ВЕРНЕТ
  40.         ничего
  41. */
  42. stock timestamp_to_date
  43. (
  44.     unix_timestamp = 0,
  45.  
  46.     & year = 1970,      & month  = 1,       & day    = 1,
  47.     & hour =    0,      & minute = 0,       & second = 0
  48. )
  49. {
  50.     year = unix_timestamp / 31557600;
  51.     unix_timestamp -= year * 31557600;
  52.     year += 1970;
  53.  
  54.     if ( year % 4 == 0 ) unix_timestamp -= 21600;
  55.  
  56.     day = unix_timestamp / 86400;
  57.  
  58.     switch ( day )
  59.     {
  60.         // в second будет временно хранится число месяца
  61.         case    0..30 : { second = day;       month =  1; }
  62.         case   31..58 : { second = day -  31; month =  2; }
  63.         case   59..89 : { second = day -  59; month =  3; }
  64.         case  90..119 : { second = day -  90; month =  4; }
  65.         case 120..150 : { second = day - 120; month =  5; }
  66.         case 151..180 : { second = day - 151; month =  6; }
  67.         case 181..211 : { second = day - 181; month =  7; }
  68.         case 212..242 : { second = day - 212; month =  8; }
  69.         case 243..272 : { second = day - 243; month =  9; }
  70.         case 273..303 : { second = day - 273; month = 10; }
  71.         case 304..333 : { second = day - 304; month = 11; }
  72.         case 334..366 : { second = day - 334; month = 12; }
  73.     }
  74.  
  75.     unix_timestamp -= day * 86400;
  76.     hour = unix_timestamp / 3600;
  77.  
  78.     unix_timestamp -= hour * 3600;
  79.     minute = unix_timestamp / 60;
  80.  
  81.     unix_timestamp -= minute * 60;
  82.     day = second + 1;
  83.     second = unix_timestamp;
  84. }
  85.  
  86. /*
  87.     Заменяет в указанной строке условные обозначения времени на их значения
  88.     в соответствии с указанным UNIX TIMESTAMP
  89.  
  90.     ПОДРОБНЕЕ
  91.         UNIX TIMESTAMP это кол-во секунд со дня 01.01.1970, 00:00:00 до
  92.         указанной в параметрах даты. Если он правильно указан, то в
  93.         строке format все условные обозначения времени будут заменены
  94.         на их значения в соответствии с указанным UNIX TIMESTAMP.
  95.  
  96.         Функция ищет:    Заменяет на:
  97.         %yyyy           четырехзначное значение года
  98.         %yy         двузначное значение года с ведущим нулём
  99.         %m          значение месяца
  100.         %mm         значение месяца с ведущим нулём
  101.         %d          значение дня
  102.         %dd         значение дня с ведущим нулём
  103.         %h          значение часа
  104.         %hh         значение часа с ведущим нулём
  105.         %i          значение минуты
  106.         %ii         значение минуты с ведущим нулём
  107.         %s          значение секунды
  108.         %ss         значение секунды с ведущим нулём
  109.  
  110.     ВЕРНЕТ
  111.         строку с численными значениями даты вместо их псевдонимов
  112.         размер строки = sizeOfOutput
  113. */
  114. stock date ( formatStr[] = "%dd.%mm.%yyyy, %hh:%ii:%ss", timestamp = 0 )
  115. {
  116.     // ------------
  117.     const sizeOfOutput = 128; // размер возвращаемой строки
  118.  
  119.     new yyyy, mm, dd, h, m, s,
  120.         pos, foundPos, searchStartPos, outStrLen,
  121.         tmpNumStr[5], outStr[sizeOfOutput];
  122.  
  123.     timestamp_to_date( timestamp+36000, yyyy,mm,dd, h,m,s ); // превратим штамп в дату
  124.     // ------------
  125.  
  126.  
  127.     // -------------------
  128.     // скопируем formatStr в outStr
  129.     memcpy( outStr, formatStr, 0, (sizeOfOutput - 1)*4 );
  130.     outStr[sizeOfOutput - 1] = 0; // правильный обрез строки в целях безопасности
  131.  
  132.     outStrLen = strlen(outStr);
  133.     // -------------------
  134.  
  135.  
  136.     // YEAR
  137.     // -------------------
  138.     searchStartPos = 0; // поз начала поиска = 0
  139.     foundPos = strfind( outStr, "%yyyy", false, searchStartPos ); // ищем первую позицию
  140.  
  141.     while ( foundPos != -1 )
  142.     {
  143.         format( tmpNumStr, 5, "%04d", yyyy ); // tmpNumStr = строкое значение yyyy
  144.  
  145.         for ( pos = 0; tmpNumStr[pos] != 0 && pos < 4; pos++ ) // замена псевдонима на значение
  146.             outStr[foundPos + pos] = tmpNumStr[pos];
  147.  
  148.         // сдвиг назад на 1 дальнейшего контента строки
  149.         for ( pos += foundPos; pos < outStrLen; pos++ )
  150.             outStr[pos] = outStr[pos + 1];
  151.  
  152.         outStr[pos] = 0; // правильный обрез строки
  153.         outStrLen = strlen(outStr); // размер строки изменился
  154.         searchStartPos = foundPos + 4; // позиция начала след. поиска += 4
  155.  
  156.         if ( searchStartPos < outStrLen ) // если поз начала поиска меньше длины строки
  157.             foundPos = strfind( outStr, "%yyyy", false, searchStartPos ); // продолжим поиск
  158.         else break; // иначе - остановим поиск и замену
  159.     }
  160.     // -------------------
  161.  
  162.  
  163.     // -------------------
  164.     searchStartPos = 0; // поз начала поиска = 0
  165.     foundPos = strfind( outStr, "%yy", false, searchStartPos ); // ищем первую позицию
  166.  
  167.     while ( foundPos != -1 )
  168.     {
  169.         format( tmpNumStr, 5, "%04d", yyyy ); // tmpNumStr = строкое значение yyyy
  170.  
  171.         for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
  172.             outStr[foundPos + pos] = tmpNumStr[pos + 2];
  173.  
  174.         // сдвиг назад на 1 дальнейшего контента строки
  175.         for ( pos += foundPos; pos <= outStrLen; pos++ )
  176.             outStr[pos] = outStr[pos + 1];
  177.  
  178.         outStr[pos] = 0; // правильный обрез строки
  179.         outStrLen = strlen(outStr); // размер строки изменился
  180.         searchStartPos = foundPos + 2; // позиция начала след. поиска изменилась
  181.  
  182.         if ( searchStartPos < outStrLen ) // если поз начала поиска меньше длины строки
  183.             foundPos = strfind( outStr, "%yy", false, searchStartPos ); // продолжим поиск
  184.         else break; // иначе - остановим поиск и замену
  185.     }
  186.     // -------------------
  187.  
  188.  
  189.     // MONTH
  190.     // -------------------
  191.     foundPos = 0; // поз начала поиска = 0
  192.     foundPos = strfind( outStr, "%mm", false, foundPos ); // ищем первую позицию
  193.  
  194.     while ( foundPos != -1 )
  195.     {
  196.         format( tmpNumStr, 3, "%02d", mm ); // tmpNumStr = строкое значение числа
  197.  
  198.         for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
  199.             outStr[foundPos + pos] = tmpNumStr[pos];
  200.  
  201.         // сдвиг назад на 1 дальнейшего контента строки
  202.         for ( pos += foundPos; pos <= outStrLen; pos++ )
  203.             outStr[pos] = outStr[pos + 1];
  204.  
  205.         outStr[pos] = 0; // правильный обрез строки
  206.         outStrLen = strlen(outStr); // размер строки изменился
  207.         foundPos += 2; // позиция начала след. поиска изменилась
  208.  
  209.         if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
  210.             foundPos = strfind( outStr, "%mm", false, foundPos ); // продолжим поиск
  211.         else break; // иначе - остановим поиск и замену
  212.     }
  213.     // -------------------
  214.  
  215.  
  216.     // -------------------
  217.     foundPos = 0; // поз начала поиска = 0
  218.     foundPos = strfind( outStr, "%m", false, foundPos ); // ищем первую позицию
  219.  
  220.     while ( foundPos != -1 )
  221.     {
  222.         format( tmpNumStr, 3, "%d", mm ); // tmpNumStr = строкое значение числа
  223.  
  224.         for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
  225.             outStr[foundPos + pos] = tmpNumStr[pos];
  226.  
  227.         // сдвиг назад на 1 дальнейшего контента строки
  228.         if ( mm < 10 )
  229.         {
  230.             for ( pos += foundPos; pos <= outStrLen; pos++ )
  231.                 outStr[pos] = outStr[pos + 1];
  232.  
  233.             outStr[pos] = 0; // правильный обрез строки
  234.             outStrLen = strlen(outStr); // размер строки изменился
  235.             foundPos++; // позиция начала след. поиска изменилась
  236.         }
  237.         else
  238.             foundPos += 2; // позиция начала след. поиска изменилась
  239.  
  240.         if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
  241.             foundPos = strfind( outStr, "%m", false, foundPos ); // продолжим поиск
  242.         else break; // иначе - остановим поиск и замену
  243.     }
  244.     // -------------------
  245.  
  246.  
  247.     // DAY
  248.     // -------------------
  249.     foundPos = 0; // поз начала поиска = 0
  250.     foundPos = strfind( outStr, "%dd", false, foundPos ); // ищем первую позицию
  251.  
  252.     while ( foundPos != -1 )
  253.     {
  254.         format( tmpNumStr, 3, "%02d", dd ); // tmpNumStr = строкое значение числа
  255.  
  256.         for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
  257.             outStr[foundPos + pos] = tmpNumStr[pos];
  258.  
  259.         // сдвиг назад на 1 дальнейшего контента строки
  260.         for ( pos += foundPos; pos <= outStrLen; pos++ )
  261.             outStr[pos] = outStr[pos + 1];
  262.  
  263.         outStr[pos] = 0; // правильный обрез строки
  264.         outStrLen = strlen(outStr); // размер строки изменился
  265.         foundPos += 2; // позиция начала след. поиска изменилась
  266.  
  267.         if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
  268.             foundPos = strfind( outStr, "%dd", false, foundPos ); // продолжим поиск
  269.         else break; // иначе - остановим поиск и замену
  270.     }
  271.     // -------------------
  272.  
  273.  
  274.     // -------------------
  275.     foundPos = 0; // поз начала поиска = 0
  276.     foundPos = strfind( outStr, "%d", false, foundPos ); // ищем первую позицию
  277.  
  278.     while ( foundPos != -1 )
  279.     {
  280.         format( tmpNumStr, 3, "%d", dd ); // tmpNumStr = строкое значение числа
  281.  
  282.         for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
  283.             outStr[foundPos + pos] = tmpNumStr[pos];
  284.  
  285.         // сдвиг назад на 1 дальнейшего контента строки
  286.         if ( dd < 10 )
  287.         {
  288.             for ( pos += foundPos; pos <= outStrLen; pos++ )
  289.                 outStr[pos] = outStr[pos + 1];
  290.  
  291.             outStr[pos] = 0; // правильный обрез строки
  292.             outStrLen = strlen(outStr); // размер строки изменился
  293.             foundPos++; // позиция начала след. поиска изменилась
  294.         }
  295.         else
  296.             foundPos += 2; // позиция начала след. поиска изменилась
  297.  
  298.         if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
  299.             foundPos = strfind( outStr, "%d", false, foundPos ); // продолжим поиск
  300.         else break; // иначе - остановим поиск и замену
  301.     }
  302.     // -------------------
  303.  
  304.  
  305.     // HOUR
  306.     // -------------------
  307.     foundPos = 0; // поз начала поиска = 0
  308.     foundPos = strfind( outStr, "%hh", false, foundPos ); // ищем первую позицию
  309.  
  310.     while ( foundPos != -1 )
  311.     {
  312.         format( tmpNumStr, 3, "%02d", h ); // tmpNumStr = строкое значение числа
  313.  
  314.         for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
  315.             outStr[foundPos + pos] = tmpNumStr[pos];
  316.  
  317.         // сдвиг назад на 1 дальнейшего контента строки
  318.         for ( pos += foundPos; pos <= outStrLen; pos++ )
  319.             outStr[pos] = outStr[pos + 1];
  320.  
  321.         outStr[pos] = 0; // правильный обрез строки
  322.         outStrLen = strlen(outStr); // размер строки изменился
  323.         foundPos += 2; // позиция начала след. поиска изменилась
  324.  
  325.         if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
  326.             foundPos = strfind( outStr, "%hh", false, foundPos ); // продолжим поиск
  327.         else break; // иначе - остановим поиск и замену
  328.     }
  329.     // -------------------
  330.  
  331.  
  332.     // -------------------
  333.     foundPos = 0; // поз начала поиска = 0
  334.     foundPos = strfind( outStr, "%h", false, foundPos ); // ищем первую позицию
  335.  
  336.     while ( foundPos != -1 )
  337.     {
  338.         format( tmpNumStr, 3, "%d", h ); // tmpNumStr = строкое значение числа
  339.  
  340.         for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
  341.             outStr[foundPos + pos] = tmpNumStr[pos];
  342.  
  343.         // сдвиг назад на 1 дальнейшего контента строки
  344.         if ( h < 10 )
  345.         {
  346.             for ( pos += foundPos; pos <= outStrLen; pos++ )
  347.                 outStr[pos] = outStr[pos + 1];
  348.  
  349.             outStr[pos] = 0; // правильный обрез строки
  350.             outStrLen = strlen(outStr); // размер строки изменился
  351.             foundPos++; // позиция начала след. поиска изменилась
  352.         }
  353.         else
  354.             foundPos += 2; // позиция начала след. поиска изменилась
  355.  
  356.         if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
  357.             foundPos = strfind( outStr, "%h", false, foundPos ); // продолжим поиск
  358.         else break; // иначе - остановим поиск и замену
  359.     }
  360.     // -------------------
  361.  
  362.  
  363.     // MINUTE
  364.     // -------------------
  365.     foundPos = 0; // поз начала поиска = 0
  366.     foundPos = strfind( outStr, "%ii", false, foundPos ); // ищем первую позицию
  367.  
  368.     while ( foundPos != -1 )
  369.     {
  370.         format( tmpNumStr, 3, "%02d", m ); // tmpNumStr = строкое значение числа
  371.  
  372.         for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
  373.             outStr[foundPos + pos] = tmpNumStr[pos];
  374.  
  375.         // сдвиг назад на 1 дальнейшего контента строки
  376.         for ( pos += foundPos; pos <= outStrLen; pos++ )
  377.             outStr[pos] = outStr[pos + 1];
  378.  
  379.         outStr[pos] = 0; // правильный обрез строки
  380.         outStrLen = strlen(outStr); // размер строки изменился
  381.         foundPos += 2; // позиция начала след. поиска изменилась
  382.  
  383.         if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
  384.             foundPos = strfind( outStr, "%ii", false, foundPos ); // продолжим поиск
  385.         else break; // иначе - остановим поиск и замену
  386.     }
  387.     // -------------------
  388.  
  389.  
  390.     // -------------------
  391.     foundPos = 0; // поз начала поиска = 0
  392.     foundPos = strfind( outStr, "%i", false, foundPos ); // ищем первую позицию
  393.  
  394.     while ( foundPos != -1 )
  395.     {
  396.         format( tmpNumStr, 3, "%d", m ); // tmpNumStr = строкое значение числа
  397.  
  398.         for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
  399.             outStr[foundPos + pos] = tmpNumStr[pos];
  400.  
  401.         // сдвиг назад на 1 дальнейшего контента строки
  402.         if ( m < 10 )
  403.         {
  404.             for ( pos += foundPos; pos <= outStrLen; pos++ )
  405.                 outStr[pos] = outStr[pos + 1];
  406.  
  407.             outStr[pos] = 0; // правильный обрез строки
  408.             outStrLen = strlen(outStr); // размер строки изменился
  409.             foundPos++; // позиция начала след. поиска изменилась
  410.         }
  411.         else
  412.             foundPos += 2; // позиция начала след. поиска изменилась
  413.  
  414.         if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
  415.             foundPos = strfind( outStr, "%i", false, foundPos ); // продолжим поиск
  416.         else break; // иначе - остановим поиск и замену
  417.     }
  418.     // -------------------
  419.  
  420.  
  421.     // SECOND
  422.     // -------------------
  423.     foundPos = 0; // поз начала поиска = 0
  424.     foundPos = strfind( outStr, "%ss", false, foundPos ); // ищем первую позицию
  425.  
  426.     while ( foundPos != -1 )
  427.     {
  428.         format( tmpNumStr, 3, "%02d", s ); // tmpNumStr = строкое значение числа
  429.  
  430.         for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
  431.             outStr[foundPos + pos] = tmpNumStr[pos];
  432.  
  433.         // сдвиг назад на 1 дальнейшего контента строки
  434.         for ( pos += foundPos; pos <= outStrLen; pos++ )
  435.             outStr[pos] = outStr[pos + 1];
  436.  
  437.         outStr[pos] = 0; // правильный обрез строки
  438.         outStrLen = strlen(outStr); // размер строки изменился
  439.         foundPos += 2; // позиция начала след. поиска изменилась
  440.  
  441.         if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
  442.             foundPos = strfind( outStr, "%ss", false, foundPos ); // продолжим поиск
  443.         else break; // иначе - остановим поиск и замену
  444.     }
  445.     // -------------------
  446.  
  447.  
  448.     // -------------------
  449.     foundPos = 0; // поз начала поиска = 0
  450.     foundPos = strfind( outStr, "%s", false, foundPos ); // ищем первую позицию
  451.  
  452.     while ( foundPos != -1 )
  453.     {
  454.         format( tmpNumStr, 3, "%d", s ); // tmpNumStr = строкое значение числа
  455.  
  456.         for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
  457.             outStr[foundPos + pos] = tmpNumStr[pos];
  458.  
  459.         // сдвиг назад на 1 дальнейшего контента строки
  460.         if ( s < 10 )
  461.         {
  462.             for ( pos += foundPos; pos <= outStrLen; pos++ )
  463.                 outStr[pos] = outStr[pos + 1];
  464.  
  465.             outStr[pos] = 0; // правильный обрез строки
  466.             outStrLen = strlen(outStr); // размер строки изменился
  467.             foundPos++; // позиция начала след. поиска изменилась
  468.         }
  469.         else
  470.             foundPos += 2; // позиция начала след. поиска изменилась
  471.  
  472.         if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
  473.             foundPos = strfind( outStr, "%s", false, foundPos ); // продолжим поиск
  474.         else break; // иначе - остановим поиск и замену
  475.     }
  476.     // -------------------
  477.  
  478.  
  479.     return outStr;
  480. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement