http://www.syslog.cc/ietf/drafts/draft-ietf-syslog-protocol-23.txt
6.2.3.1。上述链接中的示例提供了不同时间戳格式的示例。
如何解析这些时间戳C
?
即时,任何类型的消息都可以到达,我希望能够解析它。
http://www.syslog.cc/ietf/drafts/draft-ietf-syslog-protocol-23.txt
6.2.3.1。上述链接中的示例提供了不同时间戳格式的示例。
如何解析这些时间戳C
?
即时,任何类型的消息都可以到达,我希望能够解析它。
日期格式是 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 );
在此之后,extra 将是输入 tmstr 的剩余部分。这可能包括小数秒,然后将包含时区格式。如果 extra 以 '.' 开头 只需使用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;
}
然后 extra 现在将只包含时区说明符。如果它是“Z”,那么我们就完成了,因为 mktime 无论如何都会给你 UTC 时间。否则,您将有一个偏移量,例如 +03:00,因此您需要将时间修改为该小时/分钟数。