Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 13
  1. #1
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±

    Как перевести UNIX-время в формат "часы, минуты, секунды"?

    Всем доброго времени суток. Решил переписать систему банов, и сделать ее на unix (как минимум потому что это удобно). Есть ли какая та функция, которая переводит unix время в обычную дату? Заранее спасибо!

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Я, возможно, чего-то не понимаю, но чем Unix время удобнее обычного? Не проще ли в таблице хранить дату разбана в виде обычной даты, а уже там, где нужно возвращать UNIX время, возвращать его средствами MySQL?
    Как пример:
    PHP код:
    SELECT UNIX_TIMESTAMP(`unban_date`) FROM `ban
    MySQL сама переведёт дату в соответствующее время (единственное: тип столбца должен быть, соответственно, рассчитан на хранение даты. "TIMESTAMP", например).

    Да и вообще, советую изучить эту статью и научиться хоть чуть-чуть работать с функционалом MySQL, чтоб сделать действительно удобную систему.
    Например, дату разбана можно оформить так:
    PHP код:
    INSERT INTO `ban`(`unban_date`) VALUES (NOW()+INTERVAL 17 DAY)//Разбан через 17 дней 
    А проверку на то, подошло ли время разбана, можно оформить так:
    PHP код:
    SELECT 1 FROM `banipWHERE `unban_date`-NOW() > 
    Запрос вернёт 1, если игрок забанен.

    Можно так же вернуть время до разбана. Примеры запросов показаны тут.

    И это лишь самый примитивный вариант. Углубись в изучение MySQL. С этими знаниями ты в разы упростишь себе жизнь

    - - - Добавлено - - -

    Ну и ответ на твой вопрос:
    Да, есть. Не нативные, но есть. Есть даже целые библиотеки с готовыми функциями. Одна из них - клик
    Последний раз редактировалось DeimoS; 05.11.2020 в 13:53.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. #3
    Аватар для Alpano
    Пользователь

    Статус
    Оффлайн
    Регистрация
    06.02.2017
    Сообщений
    123
    Репутация:
    16 ±
    Я сделал так:
    Записал дату в время в переменную в БД, и дату РАЗБАНА UNIX time.
    И получается вывел так:
    Дата бана: %date
    Разбан через: %s
     Код функции:
    PHP код:
    timec(timestampcompare = -1) {
        if (
    compare == -1)
            
    compare gettime();
        new
            
    n,
            
    Float:= (timestamp compare) ? timestamp compare compare timestamp,
            
    returnstr[48];
        if (
    60) {
            
    format(returnstrsizeof(returnstr), "< 1 минуты");
            return 
    returnstr;
        } else if (
    3600) {
            
    floatround(floatdiv(d60.0), floatround_floor);
            
    format(returnstrsizeof(returnstr), "%s",FormatText("минута","минуты","минут",n));
        } else if (
    86400) {
            
    floatround(floatdiv(d3600.0), floatround_floor);
            
    format(returnstrsizeof(returnstr), "%s",FormatText("час","часа","часов",n));
        } else if (
    2592000) {
            
    floatround(floatdiv(d86400.0), floatround_floor);
            
    format(returnstrsizeof(returnstr), "%s",FormatText("день","дня","дней",n));
        } else if (
    31536000) {
            
    floatround(floatdiv(d2592000.0), floatround_floor);
            
    format(returnstrsizeof(returnstr), "%s",FormatText("месяц","месяца","месяцев",n));
        } else {
            
    floatround(floatdiv(d31536000.0), floatround_floor);
            
    format(returnstrsizeof(returnstr), "%s",FormatText("год","года","лет",n));
        }
        
    format(returnstrsizeof(returnstr), "%d %s"nreturnstr);
        return 
    returnstr;



    Пример:
    PHP код:
    new string[64];
    strcat(string,"Разбан через:\t\t");
        if(
    timeban == -1)
            
    strcat(string,"Никогда");
        else
            
    strcat(string,timec(timeban));
    print(string); 
    Под переменной timeban подразумевается дата РАЗБАНА в UNIX формате.
    И если timeban равра -1, то бан перманентный.
    Последний раз редактировалось Alpano; 05.03.2017 в 19:47.
    MyProject:
    DriftEmpire©

    Ленивые всё делают быстро, чтобы поскорее избавиться от работы.
    И делают качественно, чтобы потом не переделывать.

  4. #4
    Аватар для speeyx
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.07.2020
    Адрес
    Россия, Москва
    Сообщений
    15
    Репутация:
    2 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    А проверку на то, подошло ли время разбана, можно оформить так:
    PHP код:
    SELECT FROM_UNIXTIME(`unban_date`-NOW(), '%e %h:%i:%s') AS `time_leftFROM `banipWHERE `unban_date`-NOW() > 
    Которая вернёт количество времени до разбана в формате "количество_дней часы:минуты:секунды" (можно настроить как угодно), если игрок забанен.
    Провёл тест и кажется, что это не работает.

    Похоже, что неверно вычисляет...
    PHP код:
    `unban_date`-NOW() 
    В ячейке таблицы стоит дата 2020-11-01 15:00:00. NOW() на момент теста 2020-11-01 12:00:00.
    В результате вывод некорректный (вывело 1 4:34:59).

  5. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    NOW() замени на число из gettime. У тебя просто MySQL-сервер в другой временной зоне запущен.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. #6
    Аватар для speeyx
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.07.2020
    Адрес
    Россия, Москва
    Сообщений
    15
    Репутация:
    2 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    NOW() замени на число из gettime. У тебя просто MySQL-сервер в другой временной зоне запущен.
    Выводит NULL

    MySQL-сервер у меня Denwer. NOW() совпадает с тем временем, что у меня.
    Тут не нужна отладка в виде сервера, достаточно теста через SQL в phpMyAdmin.

    UPD:

    PHP код:
    WHERE `unban_date`-NOW() 
    Работает корректно, а вот FROM_UNIXTIME какой-то неадекватный.

    2UPD:

    Ну конечно...
    Таким образом мы не получим вычисление оставшегося времени из разницы.
    Функция просто выдаёт нам дату (начиная с 1 января 1970), а не выводит разницу словами.
    То есть в том случае, который я выше описал, у меня было 1 января 4 часа ночи...
    Последний раз редактировалось speeyx; 01.11.2020 в 22:21.

  7. #7
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от speeyx Посмотреть сообщение
    Выводит NULL

    MySQL-сервер у меня Denwer. NOW() совпадает с тем временем, что у меня.
    Тут не нужна отладка в виде сервера, достаточно теста через SQL в phpMyAdmin.

    UPD:

    PHP код:
    WHERE `unban_date`-NOW() 
    Работает корректно, а вот FROM_UNIXTIME какой-то неадекватный.

    2UPD:

    Ну конечно...
    Таким образом мы не получим вычисление оставшегося времени из разницы.
    Функция просто выдаёт нам дату (начиная с 1 января 1970), а не выводит разницу словами.
    То есть в том случае, который я выше описал, у меня было 1 января 4 часа ночи...
    Вопрос, в итоге, решён или что?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. #8
    Аватар для speeyx
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.07.2020
    Адрес
    Россия, Москва
    Сообщений
    15
    Репутация:
    2 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Вопрос, в итоге, решён или что?
    Получается, что Ваша идея с FROM_UNIXTIME не катит. Придётся выгружать UNIX-значение через UNIX_TIMESTAMP и уже вычислять оставшееся время в буквах там.

  9. #9
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от speeyx Посмотреть сообщение
    Получается, что Ваша идея с FROM_UNIXTIME не катит. Придётся выгружать UNIX-значение через UNIX_TIMESTAMP и уже вычислять оставшееся время в буквах там.
    А, теперь понял о чём идёт речь. Да, я там странную реализацию предложил, которая работать не будет.
    Но подобное всё равно можно вычислить на стороне MySQL.

    Можно сразу готовую строку вернуть:
    1. 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`


    Либо просто отдельно оставшееся число дней/часов/минут/секунд
    1. 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`


    Оба запроса хоть и выглядят громоздкими, но вычисления в них будут выполняться за тысячные доли секунды.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. Пользователь сказал cпасибо:
    speeyx (06.11.2020)
  11. #10
    Аватар для punkochel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Используй библиотеку time_t by ziggi.
    Так-же, для удобства можно немного изменить код в библиотеке, ибо она возвращает время по Гринвичу (UTC+0), а все хостинги расположены в основном в Москве (UTC+3), поэтому нужно конвертировать, а именно:
    Добавить константу:
    1. #define TIME_UTC 3 // Moscow time


    Добавить в начало функции gmtime:
    1. timestamp += TIME_UTC*3600;

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •