http://www.syslog.cc/ietf/drafts/draft-ietf-syslog-protocol-23.txt
6.2.3.1。 以上链接中的示例提供了不同时间戳合成器的示例。
我如何parsingC
这些时间戳?
即时,任何types的消息可以到达,我想能够parsing它。
日期格式是RFC3339的一个更严格的版本,给出一个如“2011-08-18T23:31:42Z”
我不确定strptime函数可以处理时区说明符(上面的时间字符串中的Z),因此在您自己的函数内部处理它可能更容易。 它绝对不能处理小数秒,因为struct tm不处理它们。 如果需要,可以使用struct timespec来存储小数秒。
你可以使用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 );
在此之后,额外的将是输入tmstr的其余部分。 这可能包括小数秒,然后将包含时区格式。 如果额外以'。'开始 只需用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; }
那么额外的现在只包含时区说明符。 如果它是'Z'那么我们就完成了,因为mktime给你UTC时间。 否则,你会得到一个偏移量,例如+03:00,所以你需要按照这个小时数/分钟来修改你的时间。