comment parsingr l’horodatage syslog

http://www.syslog.cc/ietf/drafts/draft-ietf-syslog-protocol-23.txt

6.2.3.1. Des exemples dans le lien ci-dessus fournissent des exemples de différents formats d’horodatage.

Comment puis-je parsingr ces horodatages en C ?

À la volée, tout type de message peut arriver et je veux pouvoir l’parsingr.

Le format de date est une version plus ssortingcte de la RFC3339 donnant une chaîne telle que ‘2011-08-18T23: 31: 42Z’

Je ne suis pas certain que la fonction strptime puisse traiter le spécificateur de fuseau horaire (Z dans la chaîne de temps ci-dessus), il peut donc être plus facile de gérer cela dans votre propre fonction. Il ne peut certainement pas gérer les fractions de secondes, car struct tm ne les gère pas. Vous pouvez utiliser struct timespec pour stocker les secondes fractionnaires si nécessaire.

Vous pouvez parsingr la plupart du format en utilisant strptime:

 struct tm tm; time_t t char *extra; extra = strptime( tmstr, "%C%y-%m-%dT%H:%M:%S", &tm ); tm.tm_isdst = -1; t = mktime( &tm ); 

Après cela, le rest de l’entrée tmstr sera ajouté. Cela peut inclure des secondes fractionnelles et contiendra alors le format de fuseau horaire. Si extra commence par un ‘.’ il suffit d’parsingr le nombre avec la fonction strtod :

 if( extra && extra[0] == '.' ) { char *endptr; fraction = strtod( extra, &endptr ); extra = endptr; /* use timespec if fractional seconds required */ struct timespec ts; ts.tv_sec = t; ts.tv_nsec = fraction * 1000000000; } 

Ensuite, extra ne contiendra plus que le spécificateur de fuseau horaire. Si c’est “Z” alors nous avons fait puisque mktime vous donne quand même l’heure UTC. Sinon, vous aurez un décalage, par exemple +03: 00, vous devrez donc modifier votre temps en fonction de ce nombre d’heures / minutes.