如何解析syslog时间戳

har*_*ari 4 c unix timestamp syslog

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

6.2.3.1.实施例在上面的链接提供了不同的时间戳甲酸盐的实例.

我该如何解析这些时间戳C

在运行中,任何类型的消息都可以到达,我希望能够解析它.

asc*_*99c 6

日期格式是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 );
Run Code Online (Sandbox Code Playgroud)

在此之后,额外将是输入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;
}
Run Code Online (Sandbox Code Playgroud)

那么extra现在只包含时区说明符.如果是'Z'那么我们就完成了,因为mktime无论如何都会给你UTC时间.否则你将有一个偏移量,例如+03:00,所以你需要按照这个小时/分钟数来修改你的时间.

  • `struct timespec`是比'double`更好的存储时间戳的方法.后者随着时间的推移而失去精确度,并且不能存储几乎肯定是微秒或纳秒的"原始值"的精确表示,而不是某些基数为2的分数形式. (2认同)