繁体   English   中英

C语言中的strtotime函数

[英]strtotime function in C

我试图在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()。

转换任何时间格式的函数是一个非常雄心勃勃的项目,请看一下PHP strtotime函数显示的公认日期格式。

但是,如果服务器上使用了几种已知的时间戳格式,则可以单独检查它们:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>

int strtomonth(int *mm, const char *str)
{
    static const char *sname[] = {
        "jan", "feb", "mar", "apr", "may", "jun",
        "jul", "aug", "sep", "oct", "nov", "dec",
        NULL
    };    
    int i;

    for (i = 0; sname[i]; i++) {
        if (strcmp(sname[i], str) == 0) {
            *mm = i + 1;
            return 1;
        }
    }

    return 0;
}

int strtotime(time_t *time, const char *s)
{
    struct tm tm;
    int dd, mm, yy;
    int hrs, min, sec;
    char buf[20];

    if (sscanf(s, "%u-%u-%u %u:%u:%u",
        &yy, &mm, &dd, &hrs, &min, &sec) == 6) goto okay;

    if (sscanf(s, "%u-%19[a-zA-Z]-%u %u:%u:%u",
        &yy, buf, &dd, &hrs, &min, &sec) == 6
        && strtomonth(&mm, buf)) goto okay;

    return 0;

  okay:
    // Do some sanity checking to rule out 2015-mar-35 and such

    tm.tm_sec = sec;
    tm.tm_min = min;
    tm.tm_hour = hrs;
    tm.tm_mday = dd;
    tm.tm_mon = mm - 1;
    tm.tm_year = yy - 1900;

    *time = mktime(&tm);
    return 1;
}

这段相当长但仍然很粗糙的代码,不会检查日期和时间是否合理,可以识别"2015-05-30 18:13:04""2015-may-30 18:13:04"这两种格式"2015-may-30 18:13:04" 您可以在遇到它们时添加更多。

goto可能很丑陋,但我认为这是最后获得通用代码的好方法。 月查询非常粗糙,但对于短字符串来说应该可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM