2009-10-11 30 views
7

Aquí es el tipo de formato temporal que busco:Usando strftime en C, ¿cómo puedo formatear la hora exactamente como una marca de tiempo Unix?

2009-10-08 04:31:33.918700000 -0500 

actualmente estoy usando esto:

strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", ts); 

cual da:

2009-10-11 13:42:57 CDT 

que está cerca, pero no exacto. Parece que no puedo encontrar nada al mostrar -0500 al final. Además estoy obteniendo los segundos como int.

¿Cómo puedo resolver estos dos problemas?

Respuesta

21

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é).

+1

'% z' sigue siendo no estándar =) – gnud

+0

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é :) –

+0

@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

1

"%Y-%m-%d %T %z", pero parece que %z es una extensión de GNU.

+3

% T no da los dígitos del segundo segundo que se solicitan en la pregunta. – unwind

Cuestiones relacionadas