Mi programa recibirá entrada de cadena C en el formato de Wed, 21 Oct 2015 07:28:00 GMT , por ejemplo
char * date = "Wed, 21 Oct 2015 07:28:00 GMT" ¿Cómo convertir esto en un struct timespec para poder compararlo con st_atim, st_mtim y st_ctim struct timespec devueltos por la función stat()?
Esta publicación habla sobre strptime y sscanf, y también encontré strftime , pero todos estos se convierten en struct time_t o struct tm o valores enteros.
Mire la definición de una timespec de tiempo:
struct timespec { time_t tv_sec; // Seconds long tv_nsec; // Nanoseconds }; Entonces, no es más que un time_t con un número adicional de nanosegundos.
Una cadena como la que mostró ( Wed, 21 Oct 2015 07:28:00 GMT ) ni siquiera tiene nada más granular que segundos, por lo que los nanosegundos apenas importarán, y puede analizarlo en un time_t que entra en tv_sec y establecer tv_nsec a cero.
Por cierto, lo más probable es que el formato que mostraste se base en las especificaciones descritas en RFC 822 / RFC 1123 / RFC 2822 . Esto debería facilitar mucho la búsqueda de código que lo analice, por ejemplo, this . Esto también se conoce informalmente como "fecha HTTP" debido a su uso en los encabezados HTTP. De hecho, libcurl tiene una función curl_getdate que lo analiza. Puedes ver su código fuente en C aquí .
Ejemplo:
#include <curl/curl.h> timespec ts = {0}; ts.tv_sec = curl_getdate(inputString, NULL); A menos que ya use libcurl en otro lugar, esto podría ser una sobrecarga innecesariamente grande, pero puede tomarlo como inspiración o buscar otros métodos de análisis que también le den un time_t .