C 从日期获取unix时间

C 从日期获取unix时间,c,date,time,C,Date,Time,我有以下变量: int year = 2013; int month = 04; int day = 07; int hour = 13; int min = 42; int sec = 00; …我需要从中提取“纪元”时间或unix时间 在标准C中如何做到这一点? 在这种情况下,unix时间应该是:。怎么样: struct tm tm = { .tm_sec = sec, .tm_min = min, ... }; time_t t = mktime(&tm

我有以下变量:

int year = 2013;
int month = 04;
int day = 07;
int hour = 13;
int min = 42;
int sec = 00;
…我需要从中提取“纪元”时间或unix时间

在标准C中如何做到这一点? 在这种情况下,unix时间应该是:。

怎么样:

struct tm tm = {
    .tm_sec = sec,
    .tm_min = min,
    ...
};

time_t t = mktime(&tm);
printf("%ju\n", (uintmax_t) t);
正如Mppl所指出的那样,在使用它之前,您应该了解
struct tm
的一些怪癖:

  • tm_mon
    定义为自一月起的月份,因此需要从月份中减去1
  • tm_year
    定义为自1900年起的年份,因此需要从年份中减去1900

在一个更迂腐的旁注中,没有什么能保证将t转换成整数会自动给出自1970年以来的秒数。它适用于许多系统,但该标准对此没有规定

如果你想成为标准的狂热者,你可以再做一次表示1970年的时间,然后在两者之间做一个时间差:你会得到一个简单诚实的双重时间差,怎么样

struct tm tm = {
    .tm_sec = sec,
    .tm_min = min,
    ...
};

time_t t = mktime(&tm);
printf("%ju\n", (uintmax_t) t);
正如Mppl所指出的那样,在使用它之前,您应该了解
struct tm
的一些怪癖:

  • tm_mon
    定义为自一月起的月份,因此需要从月份中减去1
  • tm_year
    定义为自1900年起的年份,因此需要从年份中减去1900

在一个更迂腐的旁注中,没有什么能保证将t转换成整数会自动给出自1970年以来的秒数。它适用于许多系统,但该标准对此没有规定


如果你想成为标准的狂热者,你可以制作另一个代表1970年的时间,然后在两者之间做一个时间差:你会得到区别,因为一个简单的诚实的双重时间,如果你从未使用过这个结构,上面的答案会遗漏一些你可能不会注意到的东西:

struct tm myTm = {
.tm_sec = sec,
.tm_min = min,
...
.tm_mon= mon-1,
.tm_year= year-1900,

};

time_t t = mktime(&myTm);
printf("%ju\n", (uintmax_t) t);

您应该在月份减去1,在年份减去1900,否则您会得到错误的答案。

如果您从未使用过此结构,上述答案可能会遗漏一些您可能不会注意到的内容:

struct tm myTm = {
.tm_sec = sec,
.tm_min = min,
...
.tm_mon= mon-1,
.tm_year= year-1900,

};

time_t t = mktime(&myTm);
printf("%ju\n", (uintmax_t) t);
你应该每月减去1,每年减去1900,否则你会得到错误的答案