0

我有以下变量:

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

...我需要从中提取“纪元”时间或 unix 时间。

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

4

2 回答 2

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

在一个更迂腐的旁注中,没有什么可以保证将 t 转换为整数会自动为您提供自 1970 年以来的秒数。它适用于许多系统,但标准对此没有任何规定。

如果你想疯狂标准,你可以做另一个time_t表示1970,然后在difftime两者之间做一个:你会得到一个普通诚实的区别double

于 2013-04-07T11:51:38.290 回答
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,否则您会得到错误的答案。

于 2013-04-07T12:11:29.720 回答