2013-04-07 2 views
0

У меня есть следующие переменные:Получить Юниксовое время от даты

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

... и мне нужно извлечь «эпохальное» время, или UNIX время, от них.

Как это можно сделать в стандартном C? В этом случае время unix должно быть: 1365342120.

ответ

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-ом году, или вы получите неправильный ответ.

+0

Это именно то, что я хочу сказать :) vote ~ – noalac

+0

По какой-то причине он отлично работал с -1970. – David

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 из года

В более педантичной боковой ноте, ничего не гарантирует преобразование т в целое число будет автоматически даст вам количество секунд с 1970 года работает на многих системах, но стандарт не предусматривает этого.

Если вы хотите пойти стандартный ум вы могли бы сделать еще один time_t представляющий 1970, а затем сделать difftime между двумя: вы получите разницу в качестве простого честного double.

Смежные вопросы