¿Podría ayudarme a cómo formatear una instancia de struct timeval
en un formato legible como "2010-01-01 15: 35: 10.0001"?Struct timeval a formato imprimible
Respuesta
Convierta tv_sec
usando localtime
, y strftime
, luego añada tv_usec
parte.
Puede usar la función strftime para convertir una fecha y hora en una cadena.
Necesita anexar manualmente la parte de microsegundos, ya que no está en el struct tm
con el que trata strftime
(). He aquí un fragmento:
struct timeval tv;
time_t nowtime;
struct tm *nowtm;
char tmbuf[64], buf[64];
gettimeofday(&tv, NULL);
nowtime = tv.tv_sec;
nowtm = localtime(&nowtime);
strftime(tmbuf, sizeof tmbuf, "%Y-%m-%d %H:%M:%S", nowtm);
snprintf(buf, sizeof buf, "%s.%06ld", tmbuf, tv.tv_usec);
Nota cómo usamos la precisión explícita de 06
para obtener un campo microsegundos cero llenas. Dado que los microsegundos van de 0 a 999.999, siempre deben estar acolchados a 6 dígitos. No queremos tergiversar, por ej. 57 microsegundos como 570,000 (compare "1.57" frente a "1.000057").
Esto se puede hacer de manera más eficiente al guardar el valor de retorno de strftime (que devuelve el número de bytes devueltos) y usarlo para indexar en el mismo buffer que luego se puede pasar a snprintf. Esto utilizaría un búfer y evitaría la copia adicional de la cadena de strftime(). –
Muy útil su respuesta y, en general, todo este hilo. Solo como complemento, en la última línea tal vez sería mejor especificar '",% s.% 06ld "'. Saludos – lrleon
Recibo una advertencia: el formato '% d' espera el argumento de tipo 'int', pero el argumento 5 tiene el tipo '__suseconds_t {aka long int}' [-Wformat =] en la última línea para deshacerte de él ? – bakalolo
ctime((const time_t *) &timeval.ts.tv_sec)
Creo que está buscando este código, solo para su referencia.
Combinando las respuestas y los comentarios anteriores, el cambio de formato para ser RFC3339 según norma, y la comprobación de todas las condiciones de error, se obtiene lo siguiente:
#include <stdio.h>
#include <sys/time.h>
ssize_t format_timeval(struct timeval *tv, char *buf, size_t sz)
{
ssize_t written = -1;
struct tm *gm = gmtime(&tv->tv_sec);
if (gm)
{
written = (ssize_t)strftime(buf, sz, "%Y-%m-%dT%H:%M:%S", gm);
if ((written > 0) && ((size_t)written < sz))
{
int w = snprintf(buf+written, sz-(size_t)written, ".%06dZ", tv->tv_usec);
written = (w > 0) ? written + w : -1;
}
}
return written;
}
int main() {
struct timeval tv;
char buf[28];
if (gettimeofday(&tv, NULL) != 0) {
perror("gettimeofday");
return 1;
}
if (format_timeval(&tv, buf, sizeof(buf)) > 0) {
printf("%s\n", buf);
// sample output:
// 2015-05-09T04:18:42.514551Z
}
return 0;
}
Convertir el tv_sec usando localtime_s en lugar de hora local, porque si están escribiendo una función global que puede causar algunos problemas. si su función puede trabajar en una solución multi-hilo, por favor, considere el uso de localtime_r
Esto es lo que yo uso:
#include <time.h>
#include <string.h>
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#define gmtime_r(ptime,ptm) (gmtime_s((ptm),(ptime)), (ptm))
#else
#include <sys/time.h>
#endif
#define ISO8601_LEN (sizeof "1970-01-01T23:59:59.123456Z")
char *timeval_to_str(char iso8601[restrict static ISO8601_LEN], unsigned precision, const struct timeval * restrict tv) {
struct tm tm;
if (!gmtime_r(&tv->tv_sec, &tm))
return memcpy(iso8601, "Error: Year overflow", sizeof "Error: Year overflow");
tm.tm_year %= 10*1000;
char *frac = iso8601 + strftime(iso8601, sizeof "1970-01-01T23:59:59.", "%Y-%m-%dT%H:%M:%SZ", &tm);
if (precision) {
unsigned long usecs = tv->tv_usec;
for (int i = precision; i < 6; i++) usecs /= 10;
char *spaces = frac + sprintf(frac - 1, ".%-*luZ", precision, usecs) - 3;
if (spaces > frac) while (*spaces == ' ') *spaces-- = '0';
}
return iso8601;
}
precision
especifica el ancho de la fracción de segundo. El código es y10k- y y INT_MAX
-proof.
- 1. ¿Existe una forma estándar de convertir una struct timeval en struct struct timespec?
- 2. ¿Cómo usar struct timeval para obtener el tiempo de ejecución?
- 3. ¿Cómo puedo expresar 10 milisegundos usando timeval?
- 4. HTML a PDF A4 tamaño imprimible
- 5. char imprimible en java
- 6. sizeof a struct member
- 7. C struct struct declaration
- 8. ¿Cómo se depura CSS imprimible?
- 9. Creando algo imprimible en C#
- 10. Pasando struct a la función
- 11. JQuery: ¿documentación actual, bien formateada, imprimible?
- 12. Cómo determinar si KeyCode es carácter imprimible
- 13. Crear PDF imprimible desde html dom
- 14. Copiar struct to struct en C
- 15. Versión imprimible de la biblioteca estándar Haskell
- 16. Const Struct &
- 17. milisegundos formato a formato SimpleDate
- 18. Extern Struct?
- 19. ¿Hacer FILE * struct map a un buffer?
- 20. Serializar struct con punteros a NSData
- 21. Void punteros a struct punteros en C
- 22. Lanzar un puntero struct a otro - C
- 23. Cómo convertir uint32_t a struct in_addr?
- 24. conversión de C# struct a F #
- 25. ¿Es posible convertir struct a otro?
- 26. C++: convertir cadena de fecha/hora a tm struct
- 27. typedef'ing a array vs. using a struct en C++
- 28. Convertir de formato largo a formato
- 29. ¿Convertir formato PSD a Android XML (formato)?
- 30. C struct en Python
Duplicado de http://stackoverflow.com/questions/1469495/unix-programming-struct-timeval-how-to-print-it-c-programming? –
No es un duplicado, ya que este especifica el formateo legible por humanos, apuntando a stftime, mientras que el otro simplemente extrae los segundos y los segundos. –