Сделать функцию форматирования даты с добавлением дней

Хорошо, пример.

У меня есть: 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 и предварительно индексированный массив строк текстового вывода для определенного интервала дат.

Другие вопросы по тегам