PDA

Просмотр полной версии : [Function] TimeConvert



Geebrox
14.11.2016, 01:40
Описание:


Выводит сколько времени прошло или осталось до переданного UNIX времени. Конвертирует, если меньше года, то выводит в месяцах, или если меньше месяца, то в днях и так далее до секунды


Функция:



#if !defined UNIX_MINUTE
const UNIX_MINUTE = 60;
#endif
#if !defined UNIX_HOUR
const UNIX_HOUR = UNIX_MINUTE*60;
#endif
#if !defined UNIX_DAY
const UNIX_DAY = UNIX_HOUR*24;
#endif
#if !defined UNIX_MONTH
const UNIX_MONTH = UNIX_DAY*30;
#endif
#if !defined UNIX_YEAR
const UNIX_YEAR = UNIX_MONTH*12;
#endif

stock UnixTimeConvert(array[], timestamp, array_size = sizeof(array))
{
if(array_size < 14)
return 0;
array[0] = EOS;
new
compare = gettime(),
time = (timestamp > compare) ?
(timestamp - compare) : (compare - timestamp), remainder;
if(time < UNIX_MINUTE)
{
remainder = time;
if((remainder %= 100) > 19)
remainder %= 10;
switch(remainder)
{
case 1:
strcat(array, "секунда", array_size);
case 2, 3, 4:
strcat(array, "секунды", array_size);
default:
strcat(array, "секунд", array_size);
}
}
else if(time < UNIX_HOUR)
{
remainder = time = time / UNIX_MINUTE;
if((remainder %= 100) > 19)
remainder %= 10;
switch(remainder)
{
case 1:
strcat(array, "минута", array_size);
case 2, 3, 4:
strcat(array, "минуты", array_size);
default:
strcat(array, "минут", array_size);
}
}
else if(time < UNIX_DAY)
{
remainder = time = time / UNIX_HOUR;
if((remainder %= 100) > 19)
remainder %= 10;
switch(remainder)
{
case 1:
strcat(array, "час", array_size);
case 2, 3, 4:
strcat(array, "часа", array_size);
default:
strcat(array, "часов", array_size);
}
}
else if(time < UNIX_MONTH)
{
remainder = time = time / UNIX_DAY;
if((remainder %= 100) > 19)
remainder %= 10;
switch(remainder)
{
case 1:
strcat(array, "день", array_size);
case 2, 3, 4:
strcat(array, "дня", array_size);
default:
strcat(array, "дней", array_size);
}
}
else if(time < UNIX_YEAR)
{
remainder = time = time / UNIX_MONTH;
if((remainder %= 100) > 19)
remainder %= 10;
switch(remainder)
{
case 1:
strcat(array, "месяц", array_size);
case 2, 3, 4:
strcat(array, "месяца", array_size);
default:
strcat(array, "месяцев", array_size);
}
}
else
{
remainder = time = time / UNIX_YEAR;
if((remainder %= 100) > 19)
remainder %= 10;
switch(remainder)
{
case 1:
strcat(array, "год", array_size);
case 2, 3, 4:
strcat(array, "года", array_size);
default:
strcat(array, "лет", array_size);
}
}
format(array, array_size, "%d %s", time, array);
return 1;
}


Параметры:


array[] - массив в который будет записан результат.
timestamp - UNIX время для вычисление.
array_size - не обязательный параметр, настроен по умолчанию.



Возвращаемые значения:


1 - функция успешно выполнена.
0 - функции не удалось выполниться. Размер массива для записи слишком маленький.



Пример использования:



public OnGameModeInit()
{
new time_left[14];
UnixTimeConvert(time_left, gettime()+UNIX_DAY);
printf("Внимание! До завтра остался %s", time_left);
return 1;
}


Автор: Я




UPD:


Добавлены советы от Daniel_Cortez (http://pro-pawn.ru/member.php?100-Daniel_Cortez)
Добавлены советы от ziggi (http://pro-pawn.ru/member.php?4223-ziggi)
Изменено описание

$continue$
15.11.2016, 16:44
Не понимаю, почему размер задается цифрами? (не используя функцию sizeof)


case 1:
strcat(array, " секунда", 9);
case 2, 3, 4:
strcat(array, " секунды", 9);
default:
strcat(array, " секунд", 8);

L0ndl3m
15.11.2016, 16:47
Не понимаю, почему размер задается цифрами? (не используя функцию sizeof)


case 1:
strcat(array, " секунда", 9);
case 2, 3, 4:
strcat(array, " секунды", 9);
default:
strcat(array, " секунд", 8);

Я думаю, потому что нет особого труда посчитать длину строки для 2 аргумента. При использовании sizeof будут выполнены лишние операции в функции strcat, так как размер array во много раз больше, чем длина строк во 2 аргументе.

Daniel_Cortez
15.11.2016, 20:19
Не понимаю, почему размер задается цифрами? (не используя функцию sizeof)
1. Это не функция.
2. На аргументах функций sizeof работает только для значений по умолчанию в перечислении аргументов:

stock UnixTimeConvert(array[], timestamp, array_size = sizeof(array))

Тем не менее, причина использования каких-то цифр в strcat вместо размера массива (array_size) непонятна, есть шанс получить выход за пределы массива.

Undertaker
15.11.2016, 20:59
https://vk.com/propawnru?w=wall-36097695_4181%2Fall

Совпадение? Нет, не совпадение.

Автор: Undertaker

Pa4enka
15.11.2016, 21:18
https://vk.com/propawnru?w=wall-36097695_4181%2Fall

Совпадение? Нет, не совпадение.

Автор: Undertaker

Вы хотите сказать, что если автор темы взял идею для скрипта он нарушил авторские права? Ваш код, очень сильно отличается от кода, который нам предоставил автор темы. По этому говорить о авторском праве некорректно.

(если я правильно понял суть замечания)

Undertaker
15.11.2016, 21:28
Карл, даже если я его релизнул, никакая наличие.txt лицензии, текст которого взят с интернета (шучу, даже если тобой написан) ни в каком суде не будет документом. Авторские права = патент, а патент за этот UnixTimeConvert никто не даст, даже за любой написанный ФуллРП мод также. ибо ты собираешься запатентовать то, что не существует (клоню к тому, что SAMP всего лишь пиратский мод).

https://pp.vk.me/c626426/v626426952/3b7ef/f-xvHpcip3k.jpg

А теперь на счёт кода, там все расчеты взяты именно оттуда,инициализация массива. И strcat... ( Крч я забиваю на эту тему

Если хочешь дальше продолжить нашу дискуссию, приглашаю в ЛС сюда или ВК, ибо не вижу смысла разводить оффтоп

Geebrox
15.11.2016, 22:58
https://vk.com/propawnru?w=wall-36097695_4181%2Fall

Совпадение? Нет, не совпадение.

Автор: Undertaker

И чего вы хотите добиться этим, хотите сказать что вы первым придумали такую функцию, не думаю

http://i.imgur.com/fU3RWnZ.jpg

могу скинуть оригинал переписки в лс, если этого не достаточно, может это вы взяли мою идею из других порталов, в которые я выкладывал эту функцию? Продолжим спор? Я с 100% уверенностью могу сказать, что сам лично писал каждую строчку этой функции.


Совпадение? Нет, не совпадение.

Не говорите о чем либо, если не уверены, что вы правы. Сначала проверьте это! Я НИКОГДА еще не нарушал АП. Любой человек может думать как и вы и придумывать такие же идеи как и вы. Вы не один в этом мире или не отличаетесь чем-то от других людей.

P.S. Прошу правообладателей рассмотреть мои репутации, что он без каких либо точных оснований понизил его.

ziggi
15.11.2016, 23:28
Карл, даже если я его релизнул, никакая наличие.txt лицензии, текст которого взят с интернета (шучу, даже если тобой написан) ни в каком суде не будет документом. Авторские права = патент, а патент за этот UnixTimeConvert никто не даст, даже за любой написанный ФуллРП мод также. ибо ты собираешься запатентовать то, что не существует (клоню к тому, что SAMP всего лишь пиратский мод).

https://pp.vk.me/c626426/v626426952/3b7ef/f-xvHpcip3k.jpg

А теперь на счёт кода, там все расчеты взяты именно оттуда,инициализация массива. И strcat... ( Крч я забиваю на эту тему

Если хочешь дальше продолжить нашу дискуссию, приглашаю в ЛС сюда или ВК, ибо не вижу смысла разводить оффтоп

Расчёты? Там же обычное деление на 60 и 24, будто в этом есть какая-то сложность...

По поводу темы. Использовать valstr и strins довольно не безопасно. Можно всё заменит на format, ну или хотябы перед strcat'ами вызывать valstr, чтобы избавиться от вызова strins.

А сама идея сомнительна, как показывает практика, часто бывает, что нужны другие формы слов (ох уж этот русский язык), например: "1 секундой ранее", "2 секундами ранее". Или вот: "Ждите 1 секунду".

Ещё вычисления сомнительны, цикл здесь не нужен:

while(remainder > 10 && remainder != 11)
remainder = remainder % 10;

remainder %= 100;
if (remainder > 19) {
remainder %= 10;
}

Geebrox
15.11.2016, 23:33
Расчёты? Там же обычное деление на 60 и 24, будто в этом есть какая-то сложность...

По поводу темы. Использовать valstr и strins довольно не безопасно. Можно всё заменит на format, ну или хотябы перед strcat'ами вызывать valstr, чтобы избавиться от вызова strins.

А сама идея сомнительна, как показывает практика, часто бывает, что нужны другие формы слов (ох уж этот русский язык), например: "1 секундой ранее", "2 секундами ранее". Или вот: "Ждите 1 секунду".

Ещё вычисления сомнительны, цикл здесь не нужен:

while(remainder > 10 && remainder != 11)
remainder = remainder % 10;

remainder %= 100;
if (remainder > 19) {
remainder %= 10;
}

Учту, как будет время поправлю. Но в принципе функция вычисляет, сколько прошло или осталось. Поправлю описание тоже.

Pa4enka
16.11.2016, 01:06
Карл, даже если я его релизнул, никакая наличие.txt лицензии, текст которого взят с интернета (шучу, даже если тобой написан) ни в каком суде не будет документом. Авторские права = патент, а патент за этот UnixTimeConvert никто не даст, даже за любой написанный ФуллРП мод также. ибо ты собираешься запатентовать то, что не существует (клоню к тому, что SAMP всего лишь пиратский мод).

https://pp.vk.me/c626426/v626426952/3b7ef/f-xvHpcip3k.jpg

А теперь на счёт кода, там все расчеты взяты именно оттуда,инициализация массива. И strcat... ( Крч я забиваю на эту тему

Если хочешь дальше продолжить нашу дискуссию, приглашаю в ЛС сюда или ВК, ибо не вижу смысла разводить оффтоп

Само собой, авторское право в сампе не на уровне официального т.к это все же игра. Под высказываниям "авторское право" я имел ввиду лишь уважения к автору.

Видел много робот Geebrox'a на различных форумах, его сервер(надеюсь успешный в будущем). И ни разу не замечал нарушений с его стороны. В этом сам можешь удостовериться.

$continue$
16.11.2016, 02:44
Естественно, что оператор, сонный был, когда писал. Но, все равно в array_size записывается размер передаваемого массива и не использовать его в strcat - не понятная причина.

1. Это не функция.

Geebrox
16.11.2016, 18:46
UPD:


Добавлены советы от Daniel_Cortez (http://pro-pawn.ru/member.php?100-Daniel_Cortez)
Добавлены советы от ziggi (http://pro-pawn.ru/member.php?4223-ziggi)
Изменено описание

Иван Бубнов
25.12.2016, 18:07
array[0] = EOS;

а 1, 2, 3, ... не нужно обнулять?

vovandolg
28.12.2016, 20:19
array[0] = EOS;

а 1, 2, 3, ... не нужно обнулять?

EOS - End Of String(Конец строки)

array[0] - самая первая ячейка массива, т.е. с нуля

array[0] = EOS; //в итоге если ты не понял, то мы установили в нулевой ячейке конец строки, то есть очистили, обнулили и т.п.