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

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±

    Количество дней между датами

    Приветствую. Появился один интересный вопрос: как получить количество дней между определёнными датами (например, между 01.01.2017 и 01.01.2018). Использую систему unix-времени.

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

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

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

    Steve Pavlina

  3. Пользователь сказал cпасибо:
    PawnoNoob (20.12.2017)
  4. #3
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну переводи в unix, отнимай большую дату от меньшей и переводи обратно в формат даты.
    Шот сложно

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

    Статус
    Оффлайн
    Регистрация
    25.09.2016
    Сообщений
    22
    Репутация:
    1 ±
    Цитата Сообщение от PawnoNoob Посмотреть сообщение
    Шот сложно
    (1514764800 - 1483228800) / 86400 = 365
    1514764800 - 01.01.2018
    1483228800 - 01.01.2017
    86400 - столько секунд в сутках

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

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Цитата Сообщение от MARVEL Посмотреть сообщение
    (1514764800 - 1483228800) / 86400 = 365
    1514764800 - 01.01.2018
    1483228800 - 01.01.2017
    86400 - столько секунд в сутках
    Я сюда не писал бы просто так. Я этот момент перепробовал. А если будет, например, 1514764801? При делении выходит не целое число.

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

    Статус
    Оффлайн
    Регистрация
    31.01.2017
    Сообщений
    23
    Репутация:
    0 ±
    Имеем две даты:
    PHP код:
    static yearmonthday// конечная дата
            
    static year2month2day2// начальная дата
        
    static year3month3day3// итоговая разница
        
    if(day day2// проверяем, больше ли дней в конечной дате, чем у начальной, если нет, то берём n-количество дней с 1 месяца
        
    {
            
    month--;
            
    day += GetDaysInMonth(yearmonth); 
        }
        if(
    month month2// та же проверка, что и с днями, только для месяцев 
        
    {
            
    year--;
            
    month+=12;
        }
        
    day3 day day2// ищем разницу в днях
        
    month3 month month2// ищем разницу в месяцах 
        
    year3 year year2// ищем разницу в годах
        
    printf("Разница в %d дня(-ей), %d месяц(-а) и %d лет/год"day3month3year3); // выводим результат
        
    return 1;
    }
    stock GetDaysInMonth(yearmonth// узнаем кол-во дней у каждого месяца
    {
        switch(
    month)
        {
            case 
    1,3,5,7,8,10,12: return 31;
            case 
    2:
            {
                if(
    IsLeapYear(year)) // проверка на високосный год
                    
    return 29;
                else
                    return 
    28;
            }
            default: return 
    30;
        }
        return 
    1;
    }

    stock IsLeapYear(year)
    {
        return ( (
    year == && year 100 != 0) || (year 400 == 0) );

    Пример использования, найдём разницу между текущей датой и Новым Годом:
    PHP код:
    #include <a_samp>
    main() {}

    public 
    OnGameModeInit()
    {
        static 
    year 2018,    month 1,    day 1;
        static 
    year2month2day2;
        static 
    year3month3day3;
        
    getdate(year2month2day2);
        if(
    day day2)
        {
            
    month--;
            
    day += GetDaysInMonth(yearmonth);
        }
        if(
    month month2)
        {
            
    year--;
            
    month+=12;
        }
        
    day3 day day2;
        
    month3 month month2;
        
    year3 year year2;
        
    printf("Разница в %d дня(-ей), %d месяц(-а) и %d лет/год"day3month3year3);
        return 
    1;
    }
    stock GetDaysInMonth(yearmonth)
    {
        switch(
    month)
        {
            case 
    1,3,5,7,8,10,12: return 31;
            case 
    2:
            {
                if(
    IsLeapYear(year))
                    return 
    29;
                else
                    return 
    28;
            }
            default: return 
    30;
        }
        return 
    1;
    }

    stock IsLeapYear(year)
    {
        return ( (
    year == && year 100 != 0) || (year 400 == 0) );

    В конечном итоге получаем 11 дней, 0 месяцев и 0 лет.
    По такому же принципу можно искать разницу между каким-либо промежутком времени. (Скрипт вроде рабочий, перечекал на 10 дат :D)

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

    Цитата Сообщение от PawnoNoob Посмотреть сообщение
    Я сюда не писал бы просто так. Я этот момент перепробовал. А если будет, например, 1514764801? При делении выходит не целое число.
    Если использовать unix-систему, то MARVEL написал верный пример, если будет число 1514764801, то выведет по прежнему 365 дней, ибо +1 это всего-лишь +1 секунда к общему времени.
    Последний раз редактировалось BodyanZe; 20.12.2017 в 20:36. Причина: Думал не в ту тему писал))0

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Проще взять time_t из Open-GTO (или любую другую проверенную библиотеку по работе с временем) и не парить мозг велосипедами.
    А даты приучиться хранить изначально в UNIX времени. Тогда и с часовыми поясами проблем не будет, и работать с датой будет проще простого.
    Собственно, вот так будет выглядеть вcё:
    PHP код:
    new year
        
    month
        
    day
        
    hour,
        
    minute
        
    second;
    gmtime(большая_дата-меньшая_датаyearmonthdayhourminutesecond);
    printf("%dг. %dмес. %dд. %dч. %dмин. %dсек."yearmonthdayhourminutesecond); 
    Если же даты изначально в БД хранятся, то в SQL есть свой функционал по работе с датами и лучше им пользоваться сразу
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  9. 3 пользователя(ей) сказали cпасибо:
    BodyanZe (21.12.2017) Daniel_Cortez (20.12.2017) PawnoNoob (20.12.2017)
  10. #8
    Аватар для BodyanZe
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.01.2017
    Сообщений
    23
    Репутация:
    0 ±
    Как вариант Сток..
    PHP код:
    stock UnixToDate(unix, &year, &month, &week, &day, &hour, &minute, &second)
    {
        
    year unix 31536000
        
    unix -= year*31536000
        
    month unix 2628000
        
    unix -= month*2628000;
        
    week unix 604800
        
    unix -= week*604800;
        
    day unix 86400;
        
    unix -= day*86400;
        
    hour unix 3600;
        
    unix -= hour*3600;
        
    minute unix 60
        
    unix -= minute*60
        
    second unix;
        return 
    1;

    Последний раз редактировалось BodyanZe; 21.12.2017 в 01:53.

  11. #9
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Проще взять time_t из Open-GTO (или любую другую проверенную библиотеку по работе с временем) и не парить мозг велосипедами.
    А даты приучиться хранить изначально в UNIX времени. Тогда и с часовыми поясами проблем не будет, и работать с датой будет проще простого.
    Собственно, вот так будет выглядеть вcё:
    PHP код:
    new year
        
    month
        
    day
        
    hour,
        
    minute
        
    second;
    gmtime(большая_дата-меньшая_датаyearmonthdayhourminutesecond);
    printf("%dг. %dмес. %dд. %dч. %dмин. %dсек."yearmonthdayhourminutesecond); 
    Если же даты изначально в БД хранятся, то в SQL есть свой функционал по работе с датами и лучше им пользоваться сразу
    А через mxdate можно такое реализовать? В базе дата и время хранятся в unix.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от PawnoNoob Посмотреть сообщение
    А через mxdate можно такое реализовать? В базе дата и время хранятся в unix.
    Ну если там есть функции перевода UNIX времени в дату - да.
    Если обе даты хранятся в БД и ты хочешь получить разницу между ними прямо при выгрузке, то никакие махинации на стороне сервера не нужны. Всё делается прямо в запросе и в качестве результата возвращается дата нужного формата
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  13. Пользователь сказал cпасибо:
    PawnoNoob (20.12.2017)
 

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

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

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

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

Ваши права

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