Приветствую. Появился один интересный вопрос: как получить количество дней между определёнными датами (например, между 01.01.2017 и 01.01.2018). Использую систему unix-времени.
Приветствую. Появился один интересный вопрос: как получить количество дней между определёнными датами (например, между 01.01.2017 и 01.01.2018). Использую систему unix-времени.
Ну переводи в unix, отнимай большую дату от меньшей и переводи обратно в формат даты.
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
PawnoNoob (20.12.2017)
Имеем две даты:
Пример использования, найдём разницу между текущей датой и Новым Годом:PHP код:
static year, month, day; // конечная дата
static year2, month2, day2; // начальная дата
static year3, month3, day3; // итоговая разница
if(day < day2) // проверяем, больше ли дней в конечной дате, чем у начальной, если нет, то берём n-количество дней с 1 месяца
{
month--;
day += GetDaysInMonth(year, month);
}
if(month < month2) // та же проверка, что и с днями, только для месяцев
{
year--;
month+=12;
}
day3 = day - day2; // ищем разницу в днях
month3 = month - month2; // ищем разницу в месяцах
year3 = year - year2; // ищем разницу в годах
printf("Разница в %d дня(-ей), %d месяц(-а) и %d лет/год", day3, month3, year3); // выводим результат
return 1;
}
stock GetDaysInMonth(year, month) // узнаем кол-во дней у каждого месяца
{
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 % 4 == 0 && year % 100 != 0) || (year % 400 == 0) );
}
В конечном итоге получаем 11 дней, 0 месяцев и 0 лет.PHP код:
#include <a_samp>
main() {}
public OnGameModeInit()
{
static year = 2018, month = 1, day = 1;
static year2, month2, day2;
static year3, month3, day3;
getdate(year2, month2, day2);
if(day < day2)
{
month--;
day += GetDaysInMonth(year, month);
}
if(month < month2)
{
year--;
month+=12;
}
day3 = day - day2;
month3 = month - month2;
year3 = year - year2;
printf("Разница в %d дня(-ей), %d месяц(-а) и %d лет/год", day3, month3, year3);
return 1;
}
stock GetDaysInMonth(year, month)
{
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 % 4 == 0 && year % 100 != 0) || (year % 400 == 0) );
}
По такому же принципу можно искать разницу между каким-либо промежутком времени. (Скрипт вроде рабочий, перечекал на 10 дат :D)
- - - Добавлено - - -
Если использовать unix-систему, то MARVEL написал верный пример, если будет число 1514764801, то выведет по прежнему 365 дней, ибо +1 это всего-лишь +1 секунда к общему времени.
Последний раз редактировалось BodyanZe; 20.12.2017 в 20:36. Причина: Думал не в ту тему писал))0
Проще взять time_t из Open-GTO (или любую другую проверенную библиотеку по работе с временем) и не парить мозг велосипедами.
А даты приучиться хранить изначально в UNIX времени. Тогда и с часовыми поясами проблем не будет, и работать с датой будет проще простого.
Собственно, вот так будет выглядеть вcё:
Если же даты изначально в БД хранятся, то в SQL есть свой функционал по работе с датами и лучше им пользоваться сразуPHP код:
new year,
month,
day,
hour,
minute,
second;
gmtime(большая_дата-меньшая_дата, year, month, day, hour, minute, second);
printf("%dг. %dмес. %dд. %dч. %dмин. %dсек.", year, month, day, hour, minute, second);
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
BodyanZe (21.12.2017) Daniel_Cortez (20.12.2017) PawnoNoob (20.12.2017)
Как вариант Сток..
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.
Ну если там есть функции перевода UNIX времени в дату - да.
Если обе даты хранятся в БД и ты хочешь получить разницу между ними прямо при выгрузке, то никакие махинации на стороне сервера не нужны. Всё делается прямо в запросе и в качестве результата возвращается дата нужного формата
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
PawnoNoob (20.12.2017)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)