Всем доброго времени суток. Решил переписать систему банов, и сделать ее на unix (как минимум потому что это удобно). Есть ли какая та функция, которая переводит unix время в обычную дату? Заранее спасибо!
Вид для печати
Всем доброго времени суток. Решил переписать систему банов, и сделать ее на unix (как минимум потому что это удобно). Есть ли какая та функция, которая переводит unix время в обычную дату? Заранее спасибо!
Я, возможно, чего-то не понимаю, но чем Unix время удобнее обычного? Не проще ли в таблице хранить дату разбана в виде обычной даты, а уже там, где нужно возвращать UNIX время, возвращать его средствами MySQL?
Как пример:
MySQL сама переведёт дату в соответствующее время (единственное: тип столбца должен быть, соответственно, рассчитан на хранение даты. "TIMESTAMP", например).PHP код:
SELECT UNIX_TIMESTAMP(`unban_date`) FROM `ban`
Да и вообще, советую изучить эту статью и научиться хоть чуть-чуть работать с функционалом MySQL, чтоб сделать действительно удобную систему.
Например, дату разбана можно оформить так:
А проверку на то, подошло ли время разбана, можно оформить так:PHP код:
INSERT INTO `ban`(`unban_date`) VALUES (NOW()+INTERVAL 17 DAY)//Разбан через 17 дней
Запрос вернёт 1, если игрок забанен.PHP код:
SELECT 1 FROM `banip` WHERE `unban_date`-NOW() > 0
Можно так же вернуть время до разбана. Примеры запросов показаны тут.
И это лишь самый примитивный вариант. Углубись в изучение MySQL. С этими знаниями ты в разы упростишь себе жизнь
- - - Добавлено - - -
Ну и ответ на твой вопрос:
Да, есть. Не нативные, но есть. Есть даже целые библиотеки с готовыми функциями. Одна из них - клик
Я сделал так:
Записал дату в время в переменную в БД, и дату РАЗБАНА UNIX time.
И получается вывел так:
Цитата:
Дата бана: %date
Разбан через: %s
Пример:
Под переменной timeban подразумевается дата РАЗБАНА в UNIX формате.PHP код:
new string[64];
strcat(string,"Разбан через:\t\t");
if(timeban == -1)
strcat(string,"Никогда");
else
strcat(string,timec(timeban));
print(string);
И если timeban равра -1, то бан перманентный.
NOW() замени на число из gettime. У тебя просто MySQL-сервер в другой временной зоне запущен.
Выводит NULL
MySQL-сервер у меня Denwer. NOW() совпадает с тем временем, что у меня.
Тут не нужна отладка в виде сервера, достаточно теста через SQL в phpMyAdmin.
UPD:
Работает корректно, а вот FROM_UNIXTIME какой-то неадекватный.PHP код:
WHERE `unban_date`-NOW()
2UPD:
Ну конечно... :fool:
Таким образом мы не получим вычисление оставшегося времени из разницы.
Функция просто выдаёт нам дату (начиная с 1 января 1970), а не выводит разницу словами.
То есть в том случае, который я выше описал, у меня было 1 января 4 часа ночи...
А, теперь понял о чём идёт речь. Да, я там странную реализацию предложил, которая работать не будет.
Но подобное всё равно можно вычислить на стороне MySQL.
Можно сразу готовую строку вернуть:
SELECT CONCAT_WS('д. ', FLOOR((UNIX_TIMESTAMP(`unban_date`)-UNIX_TIMESTAMP(NOW()))/86400), sec_to_time(MOD(UNIX_TIMESTAMP(`unban_date`)-UNIX_TIMESTAMP(NOW()), 86400))) as unban_time FROM `ban`
Либо просто отдельно оставшееся число дней/часов/минут/секунд
SELECT FLOOR((UNIX_TIMESTAMP(`unban_date`)-UNIX_TIMESTAMP(NOW()))/86400) AS unban_days, FLOOR((UNIX_TIMESTAMP(`unban_date`)-UNIX_TIMESTAMP(NOW()))%86400/3600) AS unban_hours, FLOOR((UNIX_TIMESTAMP(`unban_date`)-UNIX_TIMESTAMP(NOW()))%86400%3600/60) AS unban_min, FLOOR((UNIX_TIMESTAMP(`unban_date`)-UNIX_TIMESTAMP(NOW()))%86400%3600%60) AS unban_min FROM `ban`
Оба запроса хоть и выглядят громоздкими, но вычисления в них будут выполняться за тысячные доли секунды.
Используй библиотеку time_t by ziggi.
Так-же, для удобства можно немного изменить код в библиотеке, ибо она возвращает время по Гринвичу (UTC+0), а все хостинги расположены в основном в Москве (UTC+3), поэтому нужно конвертировать, а именно:
Добавить константу:
#define TIME_UTC 3 // Moscow time
Добавить в начало функции gmtime:
timestamp += TIME_UTC*3600;