如何解析系统日志时间戳

问题描述:

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); 

在此之后,多余的将是输入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,所以您需要按照小时/分钟的时间修改您的时间。

+0

非常感谢。太棒了。我只需要找出如何在'time_t'保留时间的时候添加'+03:00'。 – hari

+0

明白了。我真的很感谢你的帮助。 – hari

+2

'struct timespec'会比'double'更好地存储时间戳。后者随着时间流逝而失去精度,并且不能存储几乎肯定以微秒或纳秒为单位的“原始值”的确切表示,而不能存储一些基数2分数形式的确切表示。 –