Conversion de l’horodatage unix en AAAA-MM-JJ HH: MM: SS

J’ai un timestamp Unix dont j’ai besoin pour obtenir les valeurs de l’année, du mois, du jour, de l’heure, des minutes et des secondes. Je n’ai jamais été très bon en cours de maths alors je me demandais si vous pourriez m’aider un peu 🙂

Je dois tout faire moi-même (pas de fonctions heure.h). La langue est C.

Clause de non-responsabilité: Le code suivant ne prend pas en compte les années bissextiles ou les secondes bissextiles [l’heure Unix ne tient pas compte des secondes intercalaires. Ils sont surestimés, de toute façon. -Ed] . De plus, je ne l’ai pas testé, il peut donc y avoir des bogues. Il peut donner un coup de pied à votre chat et insulter votre mère. Bonne journée.

Essayons un petit pseudo-code (Python, vraiment):

# Define some constants here... # You'll have to figure these out. Don't forget about February (leap years)... secondsPerMonth = [ SECONDS_IN_JANUARY, SECONDS_IN_FEBRUARY, ... ] def formatTime(secondsSinceEpoch): # / is integer division in this case. # Account for leap years when you get around to it :) year = 1970 + secondsSinceEpoch / SECONDS_IN_YEAR acc = secondsSinceEpoch - year * SECONDS_IN_YEAR for month in range(12): if secondsPerMonth[month] < acc: acc -= month month += 1 month += 1 # Again, / is integer division. days = acc / SECONDS_PER_DAY acc -= days * SECONDS_PER_DAY hours = acc / SECONDS_PER_HOUR acc -= hours * SECONDS_PER_HOUR minutes = acc / SECONDS_PER_MINUTE acc -= minutes * SECONDS_PER_MINUTE seconds = acc return "%d-%d-%d %d:%d%d" % (year, month, day, hours, minutes, seconds) 

Si je me suis trompé, s'il vous plaît faites le moi savoir. Faire cela en C ne devrait pas être trop difficile.

Vous ne voulez vraiment pas le faire à la main. Vous pouvez écrire un code simple qui suppose des années, des mois, des jours, des heures, des minutes et des secondes de la même longueur (12 mois, 28, 30 ou 31 jours, 24 heures, 60 minutes et 60 secondes). avec la mauvaise réponse.

Pour obtenir la bonne réponse, vous devez gérer les années bissextiles et les secondes bissextiles et convertir le fuseau horaire local (avec le mode DST approprié). (Sauf si vous choisissez d’afficher uniquement en heure UTC.)

Je vous suggère de regarder le code de glibc et de voir comment fonctionne strftime .


Edit: l’ heure UNIX n’utilise pas la seconde bissextile.

Ce format est souvent appelé ISO 8601 et la recherche de ces informations peut vous aider.

Vous devriez avoir fait une recherche – j’ai posté une réponse complète à cette question ici juste l’autre jour (pour UTC, au moins – pour ajuster pour d’autres fuseaux horaires simplement append ou soustraire le décalage de fuseau horaire en secondes de l’unix avant d’appeler la fonction ).

Vous n’avez pas à faire de maths. Cela peut être facilement manipulé en C comme ceci,

 char *ISO_Time ( time_t time ) { static char mStr[128]; struct tm *gmt; gmt = gmtime (&time); strftime (mStr, sizeof(mStr), "%Y-%m-%dT%H:%M:%SZ", gmt); return mStr; } 

Puisque votre temps n’est pas exactement celui de l’ISO, il vous suffit de changer une ligne,

 strftime (mStr, sizeof(mStr), "%Y-%m-%d %H:%M:%S", gmt);