使用天数添加格式化日期的功能
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 日期日期,并为特定的文本输出字符串预索引数组日期间隔。
好的,举个例子。
我有: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 日期日期,并为特定的文本输出字符串预索引数组日期间隔。