从日期开始获取unix时间

时间:2013-04-07 11:47:12

标签: c date time

我有以下变量:

int year = 2013;
int month = 04;
int day = 07;
int hour = 13;
int min = 42;
int sec = 00;

...我需要从他们那里提取“纪元”时间或unix时间。

如何在标准C中完成? 在这种情况下,unix时间应为:1365342120

2 个答案:

答案 0 :(得分:3)

怎么样:

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月以来的个月,因此您需要从月中减去1
  • tm_year被定义为自1900年以来,因此您需要从年份中减去1900

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

如果你想要标准疯狂,你可以让另一个time_t代表1970,然后在两者之间做difftime:你会得到一个简单诚实的差异{ {1}}。

答案 1 :(得分:3)

如果你从未使用过这个结构,上面的回答会遗漏你可能没注意到的一些事情:

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到年,否则你会得到错误的答案。