Cómo imprimir la hora en formato: 2009-08-10 18: 17: 54.811

¿Cuál es el mejor método para imprimir el tiempo en C en el formato 2009‐08‐10 18:17:54.811 ?

Use strftime ()

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

Para la parte de milisegundos, eche un vistazo a esta pregunta. ¿Cómo medir el tiempo en milisegundos usando ANSI C?

Las respuestas anteriores no responden completamente a la pregunta (específicamente la parte de milisegundos). Mi solución a esto es usar gettimeofday antes del tiempo de trabajo. Tenga en cuenta el cuidado de evitar redondear milisegundos a “1000”. Esto se basa en la respuesta de Hamid Nazari.

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

time.h define una función strftime que puede darle una representación textual de un time_t usando algo como:

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

pero eso no le dará una resolución por debajo del segundo puesto que no está disponible desde un time_t . Emite:

 2010-09-09 10:08:34.000 

Si realmente está limitado por las especificaciones y no quiere el espacio entre el día y la hora, simplemente elimínelo de la cadena de formato.

El siguiente código se imprime con una precisión de microsegundos. Todo lo que tenemos que hacer es usar strftime y strftime en tv_sec y anexar tv_usec a la cadena construida.

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

Puede usar strftime , pero struct tm no tiene resolución por partes de segundos. No estoy seguro si eso es absolutamente necesario para sus propósitos.

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