如何将“2012-03-02”转换为C中的unix纪元时间?

时间:2012-03-03 00:35:06

标签: c datetime date time

表示2012年3月2日的字符串“2012-03-02”作为输入变量(char *)。

如何使用C编程语言将此日期转换为unix纪元时间?

5 个答案:

答案 0 :(得分:3)

使用sscanf提取部分,使用提取的数据填充struct tm(来自<time.h>),最后使用mktime将其转换为time_t

time_t ParseDate(const char * str)
{
    struct tm ti={0};
    if(sscanf(str, "%d-%d-%d", &ti.tm_year, &ti.tm_mon, &ti.tm_day)!=3)
    {
        /* ... error parsing ... */
    }
    ti.tm_year-=1900
    ti.tm_mon-=1
    return mktime(&ti);
}

答案 1 :(得分:2)

C(POSIX)为此提供了一个功能。使用strptime()将字符串转换为struct tm值。然后,您可以使用mktime()struct tm转换为time_t

答案 2 :(得分:2)

当地时间还是UTC?如果它是UTC,那么进行转换的最简单方法是完全避免使用C时间API,并在时间段内使用POSIX中的公式秒:

tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
    (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 -
    ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400

来源:http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15

如果是当地时间,问题会变成地狱,因为除了POSIX系统之外,time_t不能保证表示为自纪元以来的秒数,并且事实上很难计算time_t 1}}对应于纪元的值(mktime将不起作用,因为它使用本地时间)。但是,一旦计算了纪元的time_t,就可以使用mktime来表示您解析的时间值,然后调用difftime

答案 3 :(得分:0)

将其读入struct tm并致电mktime以获取time_t

答案 4 :(得分:0)

这是我的解决方案:

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

int main(void) {
    time_t epoch;
    char timeString[80] = { "05 07 2021 00 33 51" }; 
    struct tm my_tm;
    char buffer[80];

    memset(&my_tm, 0, sizeof(my_tm));
    if (sscanf(timeString, "%d %d %d %d %d %d", &my_tm.tm_mon, &my_tm.tm_mday, &my_tm.tm_year, &my_tm.tm_hour, &my_tm.tm_min, &my_tm.tm_sec) != 6)
    {
        /* ... error parsing ... */
        printf(" sscanf failed");
        return 1;
    }
    my_tm.tm_isdst = -1;
    my_tm.tm_year -= 1900;
    my_tm.tm_mon -= 1;

    epoch = mktime(&my_tm);
    if (epoch == -1) {
        printf("Error: unable to make time using mktime\n");
    }
    else {
        strftime(buffer, sizeof(buffer), "%c", &my_tm);
        printf("%s  (epoch=%ld)", buffer, (long)epoch);
    }

    return(0);
}

注意:此代码将您提供的输入转换为“Fry May 7 00:33:51”和 epoch=1620340431,这不是您在评论中提到的(在 Win10 下使用 MSVC 运行)