使用天数添加格式化日期的功能

Make function to format date with days adding

好的,举个例子。

我有:18-03-2016

我有一个函数,在函数中可以添加天、月和年(带参数)

如果我加上 14 天和 4 个月,

该格式之后的日期为:2016 年 7 月 32 日

我需要 make 函数来正确添加 days/months/years

我想把月数转换成天数,然后这样操作..但问题是闰年。

我也想过将日期转换为 unixtime,加上时间并将 unix 时间转换为 dd-mm-yy,但我不知道,我对此有很多问题..

编程语言是"PAWN",类似于C..但是在这种编程语言中我们没有POO(我提到这个是为了让他们知道这种编程语言的基础是什么时候,只是基于逻辑和基础structure .. for, if, else, case, etc ..), 不存在像 strpftime, strtototime, date(.., etc.

这样的函数

我把这个功能转换成..

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 并获得 sub-days.. 但我不知道这是否是最好的方法..

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;
}

我建议您转换为 Unix 时间,加上必要的天数,然后再转换回来。您需要按以下顺序调用函数:

strftime -> mktime -> (modify unix time) -> localtime -> strptime

请参阅这些功能的手册。

如果您需要快速执行此转换,并且有足够的内存 - 我建议使用哈希表(包含所有可能的答案)将文本日期表示转换为 unix 日期日期,并为特定的文本输出字符串预索引数组日期间隔。