Всем доброго времени суток. Решил переписать систему банов, и сделать ее на 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;
Так, вроде, с тем, как конвертировать время на стороне сервера, ни у кого проблем нет. Вопрос был в том, как получать сразу конвертированные данные и не тратить время на дополнительную обработку. И это вполне логично, с учётом того, что MySQL неслабо так умеет сама себя оптимизировать, производя минимум лишних действий, из-за чего даже те длинные запросы, которые я выше давал, будут обрабатываться быстро.
Можно вообще создать функцию средствами SQL прямо в БД и в запросе вызывать эту функцию. Тогда запрос будет коротким и, при этом, быстрым.
По моему - по существу все. Может просто ты сам уже автоматически решил сделать более оптимизированный вариант, и тем самым усложнил все?)Цитата:
Всем доброго времени суток. Решил переписать систему банов, и сделать ее на unix (как минимум потому что это удобно). Есть ли какая та функция, которая переводит unix время в обычную дату? Заранее спасибо!
Соглашусь с тобой, грамотное использование SQL во много раз может уменьшить нагрузку на скрипт.
Ну если перечитаешь тему, то и увидишь, что я именно это и предложил сделать.
Мой вариант не сложнее варианта с подключением дополнительной библиотеки и дополнительной обработки уже полученных данных. Скорее, наоборот - оптимизированнее и проще :)
Думаю, вопрос решён, так что закрою тему.
UPD: К слову, я в первом же своём сообщении дал ссылку на time_t =)