me ocurrió esto:
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);
}
correcciones para los problemas que tuvo:
- Uso
gettimeofday()
y struct timeval
, que tiene un miembro de microsegundos para la más alta precisión.
- Utilice un enfoque de dos pasos, donde primero construimos una cadena que contiene todos los datos excepto los microsegundos.
- Use minúsculas 'z' para el desplazamiento de la zona horaria. Esto parece ser una extensión de GNU.
He intentado volver a crear el desplazamiento manualmente, a través de la segunda struct timezone *
argumento de gettimeofday()
zona horaria, pero en mi máquina se vuelve un desplazamiento de 0, lo que no es correcto. El manual page para gettimefday()
tiene mucho que decir sobre el manejo de zonas horarias bajo Linux (que es el sistema operativo que probé).
'% z' sigue siendo no estándar =) – gnud
Gracias, esto es lo más cerca que he estado hasta ahora. El '%% 06u' me está devolviendo información basura ahora, pero el resto funciona bien. P.S Sí, sé que% z no es estándar, pero lo tomaré :) –
@aditya: Eso es raro ... El código anterior debería funcionar. Asegúrese de proporcionar la segunda llamada snprintf() con un valor adecuado de microsegundos sin firmar para usar en el formato% 06u. Puede intentar imprimir el resultado después de la llamada strftime(), debería ver su salida final a excepción de la secuencia% 06u después del período. – unwind