2016-03-19 1 views
4

je fais une fonction, pour convertir le temps unix à ce jour (jj-mm-aaaa)convertir le temps unix à ce jour

stock UnixToTime(x) 
{ 
    new year = 1970; 
    new dia = 1; 
    new mes = 1; 

    while(x > 86400) 
    { 
     x -= 86400; 
     dia ++; 

     if(dia == getTotalDaysInMonth(mes, year)) 
     { 
      dia = 1; 
      mes ++; 

      if (mes >= 12) 
      { 
       year ++; 
       mes = 1; 
      } 
     } 
    } 
    printf("%i-%i-%i", dia, mes, year); 
    return x; 
} 

mais fonctionne pas.

Je suis en train de tester la fonction avec 1458342000 (aujourd'hui ...) mais j'imprime> 13-3-2022, quelle est l'erreur?

#define IsLeapYear(%1)  ((%1 % 4 == 0 && %1 % 100 != 0) || %1 % 400 == 0) 

getTotalDaysInMonth est ceci;

stock getTotalDaysInMonth(_month, year) 
{ 
    new dias[] = { 
     31, // Enero 
     28, // Febrero 
     31, // Marzo 
     30, // Abril 
     31, // Mayo 
     30, // Junio 
     31, // Julio 
     31, // Agosto 
     30, // Septiembre 
     31, // Octubre 
     30, // Noviembre 
     31 // Diciembre 
    }; 
    return ((_month >= 1 && _month <= 12) ? (dias[_month-1] + (IsLeapYear(year) && _month == 2 ? 1 : 0)) : 0); 
} 
+0

Post a également le code de 'IsLeapYear'. – chqrlie

+0

Si vous avez besoin de quelque chose comme ceci pour la production, je regarderais cette bibliothèque seulement d'en-tête: https://github.com/HowardHinnant/date – MikeMB

+0

Il y a des fonctions de bibliothèque pour ce genre de chose. Pourquoi ne les utilisez-vous pas à la place? –

Répondre

3

Il y a plusieurs problèmes avec votre algorithme:

  • le test de boucle while doit être while(x >= 86400), sinon vous êtes hors d'un jour à minuit.
  • vous devriez seulement passer à une nouvelle année quand mes > 12, pas >=.
  • le même problème pour les jours de comptage: vous devez cocher le mois si if (dia > getTotalDaysInMonth(mes, year)) sinon vous passez le dernier jour de chaque mois. Le code getTotalDaysInMonth(mes, year) semble OK.
  • le code pour IsLeapYear peut être plus simple que la règle générique grégorienne car il n'y a aucune exception entre 1970 et 2099. Vous devriez toujours l'afficher juste au cas où il y aurait une erreur.

Voici une version corrigée:

stock UnixToTime(x) { 
    new year = 1970; 
    new dia = 1; 
    new mes = 1; 

    while (x >= 86400) { 
     x -= 86400; 
     dia++; 
     if (dia > getTotalDaysInMonth(mes, year)) { 
      dia = 1; 
      mes++; 
      if (mes > 12) { 
       year++; 
       mes = 1; 
      } 
     } 
    } 
    printf("%i-%i-%i\n", dia, mes, year); 
    return x; 
} 
+0

Merci, vous avez raison. Et le pardon, et je l'ai ajouté. La fonction IsLeapYear est la base souvent utilisée .. ((% 1% 4 == 0 &&% 1% 100! = 0) ||% 1% 400 == 0) – iZume

+0

J'ai déjà fait les changements, et maintenant j'imprime: 10.12. 2017 – iZume

+0

@ Spitzer: même problème pour les jours ... – chqrlie