c - 如何解析系统日志时间戳

标签 c unix timestamp syslog

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,因此您需要按该小时数/分钟数修改您的时间。

关于c - 如何解析系统日志时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7114690/

相关文章:

Mysql,无法创建表

linux - 按字段排序 UNIX

sql - 如何在 Postgresql 的时间戳中添加文化不变信息?

在特定 NUMA 节点上创建命名共享内存?

c - Unix C Shell - 作业控制问题!

java - 如何使用 NDK 将 Lame 3.99.5 添加到 Android Studio?

amazon-s3 - 如何删除或清除S3上的旧文件?

java - java中时间戳字符串转时间戳

c - 将fork的返回值保存在C中的变量中

c - 来自 makedepend 的警告