Сделать функцию форматирования даты с добавлением дней
Хорошо, пример.
У меня есть: 18-03-2016
И у меня есть функция, и в функцию можно добавить дни, месяцы и годы (с параметрами)
если я добавлю 14 дней и 4 месяца,
следующие дни в этом формате: 32-07-2016
мне нужно сделать функцию, чтобы правильно добавить дни / месяцы / годы
я думал, что месяцы переводятся в дни и работают так... но проблема в високосных годах.
Я также подумал о преобразовании даты в unixtime, добавлении времени и преобразовании времени unix в dd-mm-yy, но я не знаю, у меня много проблем с этим..
Язык программирования "PAWN", похожий на C.. но в этом языке программирования у нас нет POO (я упоминаю об этом, чтобы они знали, когда этот язык программирования является базовым, он основан только на логике и базовой структуре... для, если, если, else, case и т.д..), не существует таких функций, как strpftime, strtototime, date(.. и т. д.
я делаю эту функцию для преобразования..
stock DateToStamp(_day, _month, _year)
{
new total = 0;
new tmp = 0;
total += _day * 86400;
tmp = ((_year - 1968)/4)-((IsLeapYear(_year) && _month == 2) ? 2 : 1);
total += tmp * 31556926;
total += (_year - 1970 - tmp) * 31536000;
for(new i = 1; i < _month; i ++)
{
total += getTotalDaysInMonth(i, _year) * 86400;
}
total += 630214;
return total;
}
stock StampToDate(timestamp, &_day, &_month, &_year)
{
new year = 1970;
new day = 1;
new month = 1;
timestamp += 86400;
while(timestamp > 31536000)
{
timestamp -= 31536000;
if(IsLeapYear(year))
{
timestamp -= 86400;
}
year++;
}
while(timestamp > 86400)
{
timestamp -= 86400;
day++;
if(day == getTotalDaysInMonth(month, year))
{
month++;
}
}
printf("%i-%i-%i", day, month, year);
_day = day;
_month = month;
_year = year;
return 1;
}
stock GetTotalDaysFromYear(year)
{
return IsLeapYear(year) ? 366 : 365;
}
и я думаю, что сделать эту функцию, основанную на логике... но не работать, моя идея была получить месяцы и разделить на 12 (в случае, если у нас есть десятичное число.. 1.0435, взять 1 и 0,0435, разделенные, чтобы умножить на 12 и получить под-дней.. но я не знаю, если это лучший метод..
stock GetDateDateAddingDays(days, months, years, _day, _month, _year, &dia, &mes, &year)
{
printf("--------------");
// Obtener los meses generales;
new meses_generales = months;
new d, month_s;
new Float:obtener_operado = float(meses_generales)/12;
printf("%f", obtener_operado);
new get_entero = floatround(obtener_operado, floatround_floor);
printf("%i", get_entero);
new Float:obtener_decimales = obtener_operado-get_entero;
printf("[deb - f] %f - %f", obtener_operado, obtener_decimales);
new get_dias_from_meses = floatround(obtener_decimales * 12, floatround_floor);
printf("dias: %i", get_dias_from_meses);
/*
new get_days;
new day_residuo = floatround(f, floatround_ceil)/12;
new operable = f/12;
printf("[deb - day_residuo] %f", operable);
operable = operable-floatround(f, floatround_ceil);
new res = f_s - operable;
new month_s = f_s - f;
printf("[deb] %f - %f - %f", operable, f_s, f);
if(f > 0)
{
printf("____________ PRIMA ______________");
printf("[deb] %i", get_days);
get_days += floatround(f * 12, floatround_ceil);
printf("[deb] %i", get_days);
printf("____________ PRIMA ______________");
}
new d = days + get_days;
*/
printf("[deb] %i - meses %f - ages = %i", d, month_s, years);
/*
for(new m; m = months; m++)
{
for(new d = 1; d <= getTotalDaysInMonth(m, _year); d++)
{
days ++;
if(days == getTotalDaysInMonth(m, _year))
{
mes ++;
}
if(mes >= 12 && days >= 31){
year ++;
}
}
}
*/
/*
new tiempo = DateToStamp(_day, _month, _year);
tiempo += (days * 86400) + (months * 2592000) + (years * 31536000);
StampToDate(tiempo, dia, mes, year);*/
printf("--------------");
return 1;
}
1 ответ
Я предлагаю вам перевести время в Unix, добавить необходимое количество дней и выполнить обратное преобразование. Вы нуждались в вызове функции в следующем порядке:
strftime -> mktime -> (modify unix time) -> localtime -> strptime
Смотрите руководства для этих функций.
Если вам нужно выполнить это преобразование быстро и иметь достаточно памяти - я рекомендую использовать хеш-таблицу (содержит все возможные ответы) для преобразования текстового представления даты в день даты Unix и предварительно индексированный массив строк текстового вывода для определенного интервала дат.