【发布时间】:2015-08-09 19:02:45
【问题描述】:
我正在尝试在 C 中创建一个通用函数,该函数可以将任何格式的任何服务器日志文件中的日期转换为时间戳,因为我想记录潜在黑客破解服务器失败的频率。在 PHP 中我可以使用 strtotime,但我认为 C 中不存在这样的功能。
如果所有日志文件都使用 YYYY-MM-DD HH:MM:SS 形式的相同时间格式,那么我可以使用这样的代码:
//tmadd = 19 bytes as a char reserved for date/time plus trailing null
long result=0;
struct tm x;
if (sscanf(tmadd,"%i-%i-%i %i:%i:%i",&x.tm_year,&x.tm_mon,&x.tm_mday,&x.tm_hour,&x.tm_min,&x.tm_sec) >= 6){x.tm_year-=1900;result=mktime(&x);}
问题是一些日志有几个月作为单词,我还没有找到一个函数来捕获数字等价物。
我希望能够在一个函数中完成整个转换。
是否有一个简单的函数可以用来从任何指定日期以任何通用格式获取原始时间戳?我基本上是在寻找一种方法来推出我自己的 PHP 的 strtotime()。
【问题讨论】:
-
POSIX 有
strptime()。 POSIX 不是通用的。 -
@pmg:很好奇:什么是通用的?我只能想到一个人,但这也可能与外星人(是的,来自上面的)编码有问题。
-
当我在 C 的上下文中听到“通用”时,我将其解释为属于 C99 标准(或者如果“通用”包括 windows,则可能是 C89 标准)。
-
如果您想捕捉多种格式并进行合理的错误检查,
sscanf可能不是一个好方法。不过,您可以存储多个模式,并逐个检查它们。 -
@pmg:嗯,那将是程序代码。对于数据格式,我实际上会看到更广泛的内容。或者只是坚持 ISO8601。但“普遍”是非常雄心勃勃的。