2016-03-18 1 views
2

ok, exemple.Faire une fonction pour formater la date avec les jours ajoutant

je: 18-03-2016

Et j'ai une fonction et dans la fonction est possible d'ajouter jours, mois et années (avec params)

si j'ajouter 14 jours et 4 mois,

les jours suivants ce format seront: 32-07-2016

je dois faire fonction pour ajouter des jours/mois/année correctement

je pensais à mont hs conversion en jours et fonctionne donc .. mais le problème est avec les années bissextiles.

Je pensais aussi à convertir la date à unixtime, ajouter le temps et convertir le temps unix à dd-mm-yy, mais je sais pas, j'ai beaucoup de problèmes avec ce ..

Le langage de programmation est "PAWN", similaire à C .. mais dans ce langage de programmation nous n'avons pas de POO (je mentionne cela afin qu'ils sachent quand basique est ce langage de programmation, seulement est basé sur la logique et la structure de base .. pour, si, sinon, cas , etc ..), ne pas exister des fonctions telles que strpftime, strtototime, date (.., etc.

je fais cette fonction à la conversion ..

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

et je pense en faire cette fonction basée sur la logique .. mais pas de travail, mon idée était de mois et diviser avec 12 (au cas où nous avons un nombre décimal .. 1.0435, prendre le 1 et 0.0435 séparés pour multiplier pour 12 et obtenir Subs jours .. mais je sais pas si c'est la meilleure méthode ..

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

Répondre

1

Je vous suggère de convertir en temps Unix, ajouter un nombre de jours nécessaires et reconvertir. Vous avez besoin de la fonction d'appel dans l'ordre suivant:

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

Voir les manuels pour ces fonctions.

Si vous avez besoin d'effectuer cette transformation rapidement, et avez assez de mémoire - je recommande d'utiliser hashtable (contient toutes les réponses possibles) pour transformer la représentation de date de texte en jour unix et tableau pré-indexé intervalle.