web-dev-qa-db-fra.com

Comment imprimer l'heure au format: 2009‐08‐10 18: 17: 54.811

Quelle est la meilleure méthode pour imprimer le temps en C au format 2009‐08‐10 
18:17:54.811?

81
Dominic Bou-Samra

Utilisez strftime () .

#include <stdio.h>
#include <time.h>

int main()
{
    time_t timer;
    char buffer[26];
    struct tm* tm_info;

    time(&timer);
    tm_info = localtime(&timer);

    strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info);
    puts(buffer);

    return 0;
}

Pour la partie millisecondes, jetez un oeil à cette question. Comment mesurer le temps en millisecondes avec ANSI C?

94
Hamid Nazari

Les réponses ci-dessus ne répondent pas complètement à la question (en particulier la partie millisec). Ma solution à cela consiste à utiliser gettimeofday avant strftime. Notez le soin d'éviter d'arrondir millisec à "1000". Ceci est basé sur la réponse de Hamid Nazari.

#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <math.h>

int main() {
  char buffer[26];
  int millisec;
  struct tm* tm_info;
  struct timeval tv;

  gettimeofday(&tv, NULL);

  millisec = lrint(tv.tv_usec/1000.0); // Round to nearest millisec
  if (millisec>=1000) { // Allow for rounding up to nearest second
    millisec -=1000;
    tv.tv_sec++;
  }

  tm_info = localtime(&tv.tv_sec);

  strftime(buffer, 26, "%Y:%m:%d %H:%M:%S", tm_info);
  printf("%s.%03d\n", buffer, millisec);

  return 0;
}
24
Chris

time.h définit une fonction strftime qui peut vous donner une représentation textuelle d’un time_t en utilisant quelque chose comme:

#include <stdio.h>
#include <time.h>
int main (void) {
    char buff[100];
    time_t now = time (0);
    strftime (buff, 100, "%Y-%m-%d %H:%M:%S.000", localtime (&now));
    printf ("%s\n", buff);
    return 0;
}

mais cela ne vous donnera pas une résolution inférieure à une seconde car ce n'est pas disponible à partir d'un time_t. Il produit:

2010-09-09 10:08:34.000

Si vous êtes vraiment contraint par les spécifications et que vous ne voulez pas d'espace entre le jour et l'heure, supprimez-le simplement de la chaîne de formatage.

9
paxdiablo

Le code suivant est imprimé avec une précision de l'ordre de la microseconde. Tout ce que nous avons à faire est d’utiliser gettimeofday et strftime sur tv_sec et append tv_usec à la chaîne construite.

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int main(void) {
    struct timeval tmnow;
    struct tm *tm;
    char buf[30], usec_buf[6];
    gettimeofday(&tmnow, NULL);
    tm = localtime(&tmnow.tv_sec);
    strftime(buf,30,"%Y:%m:%dT%H:%M:%S", tm);
    strcat(buf,".");
    sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
    strcat(buf,usec_buf);
    printf("%s",buf);
    return 0;
}
4
Nataraj

Vous pouvez utiliser strftime, mais struct tm n'a pas de résolution pour des parties de secondes. Je ne sais pas si cela est absolument nécessaire pour vos besoins.

struct tm tm;
/* Set tm to the correct time */
char s[20]; /* strlen("2009-08-10 18:17:54") + 1 */
strftime(s, 20, "%F %H:%M:%S", &tm);
2
Jack Kelly