9
votes

Utilisation de la Strftime en C, comment puis-je formater le temps exactement comme un horodatage UNIX?

Voici le type de formatage du temps, je suis après: xxx

Je suis actuellement en train d'utiliser ce: xxx

ce qui donne: xxx

qui est proche, mais pas exact. Je n'arrive pas à trouver quoi que ce soit sur l'affichage d'affichage -0500 à la fin. De plus, je reçois les secondes comme un int.

Comment puis-je résoudre ces deux problèmes?


0 commentaires

3 Réponses :


1
votes

% z (minuscule Z).

Cependant, cela n'apparaît pas dans le Spécification POSIX . Google m'a emmené dans un cercle retour ici .


0 commentaires

1
votes

"% y-% m-% d% t% z" , mais il semble % z est une extension GNU.


1 commentaires

% T ne donne pas les chiffres subectoraux demandés dans la question.



24
votes

Je suis venu avec ceci:

    char            fmt[64], buf[64];
    struct timeval  tv;
    struct tm       *tm;

    gettimeofday(&tv, NULL);
    if((tm = localtime(&tv.tv_sec)) != NULL)
    {
            strftime(fmt, sizeof fmt, "%Y-%m-%d %H:%M:%S.%%06u %z", tm);
            snprintf(buf, sizeof buf, fmt, tv.tv_usec);
            printf("'%s'\n", buf); 
    }
  • Utilisez gettimeoDay () code> et struct Timeval code>, qui a un membre de microsecondes pour la précision supérieure. LI>
  • Utilisez une approche en deux étapes, où nous construisons d'abord une chaîne contenant toutes les données à l'exception des microsecondes. Li>
  • Utilisez des "Z" minuscules pour le décalage de fuseau horaire. Cela semble être une extension GNU. Li> ul>

    J'ai essayé de ré-créer le décalage de fuseau horaire manuellement, via la seconde code> Struct Timezone * code> argument de GettimeOdday () code>, mais sur ma machine, il renvoie un Décalage de 0 ce qui n'est pas correct. Page manuelle pour GetTimeFay () Code> a Beaucoup de choses à dire sur la manipulation de Timezones sous Linux (qui est le système d'exploitation que j'ai testé). P> p>


7 commentaires

% z est toujours non standard =)


Merci, c'est le plus proche que j'ai obtenu jusqu'à présent. Le '%% 06U' vient de jeter des données de déchets à moi en ce moment, mais le reste fonctionne bien. P.s oui, je sais que le% z est non standard, mais je vais le prendre :)


@aditya: C'est bizarre ... Le code ci-dessus devrait fonctionner. Assurez-vous de fournir le deuxième appel SNPRINTF () avec une valeur de microsecondes non signée appropriée à utiliser pour le format% 06U. Vous pouvez essayer d'imprimer le résultat après l'appel de StrfTime (), vous devez voir votre sortie finale, à l'exception de la séquence% 06U après la période.


Il semble que tout le monde a manqué le fait que% Z est complètement standard C99. C'est dans le projet N1256 (Document de travail TC3), disponible librement), ainsi que le document standard officiel, et il est également spécifié dans POSIX ( pubs.opengroup.org/onlinepubs/9699919799/fonctions/... ).


TV.TV_USEC est TYPE SUSECONDS_T . N'ont pas trouvé de modificateur% pour cela. Peut-être qu'un casting to (non signé long) et utiliser % 06lu . (ou couler à (uintMax_t) et utilisez priumax.


Je pense que la raison %% 06U est de jeter des ordures est que l'USEC peut être une longue intensive, pas un int. Donc, vous devrez peut-être utiliser %% 06LU à la place.


% z peut également être imprimé à l'aide de Timezone :: tz_minutewest ou TM :: tm_gmtoff . Le dernier semble être non standard, cependant.