time_t
тип представляет Unix time , количество секунд с четверга, 1 января 1970 года, 00:00:00 UTC, минус високосные секунды.
(Интерфейс POSIX clock_gettime()
может увеличить поддержку CLOCK_TAI
, которая будет такой же, за исключением , включая високосных секунд.)
Для манипулирования датой лучше использовать стандартное время разбивки C struct tm
, как указано в localtime()
или gmtime()
.
localtime()
использует текущий часовой пояс. (В системах Linux по умолчанию установлен часовой пояс в /etc/timezone
, но каждый пользователь может переопределить его, установив переменную среды TZ
. Подробнее о том, как это сделать, см. В функции tzset()
POSIX.1. ) gmtime()
использует UTC.
«Хитрость» заключается в том, что если вы вызываете mktime()
на struct tm
, описывающем дату и время в текущем часовом поясе, он сначала нормализует поля, а затем возвращает время Unix как time_t
, соответствующее этой дате и местному времени. Например, если день месяца равен 45, он будет корректировать день, месяц и год (и соответствующие поля) для отображения фактической даты.
Итак, если вы хотите узнать дату и время через пять дней и шесть часов:
time_t now, then;
struct tm *t;
now = time(NULL);
t = localtime(&now);
printf("Now is %llu = %04d-%02d-%02d %02d:%02d%02d\n",
(unsigned long long)now,
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
t->tm_hour, t->tm_min, t->tm_sec);
t->tm_hour += 6;
t->tm_mday += 5;
t->tm_isdst = -1; /* Don't know if DST or not; please guess. */
then = mktime(t);
printf("Then is %llu = %04d-%02d-%02d %02d:%02d:%02d\n",
(unsigned long long)then,
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
t->tm_hour, t->tm_min, t->tm_sec);
Если мы опускаем печать значений now
и then
, приведенный выше код является совершенно стандартным кодом C и будет работать во всех текущих операционных системах.
Если вы используете Linux или другую систему POSIXy (Mac, BSD), было бы лучше использовать
time_t now, then;
struct tm tbuffer, *t;
now = time(NULL);
t = localtime_r(&now, &tbuffer);
printf("Now is %llu = %04d-%02d-%02d %02d:%02d%02d\n",
(unsigned long long)now,
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
t->tm_hour, t->tm_min, t->tm_sec);
t->tm_hour += 6;
t->tm_mday += 5;
t->tm_isdst = -1; /* Don't know if DST or not; please guess. */
then = mktime(t);
printf("Then is %llu = %04d-%02d-%02d %02d:%02d:%02d\n",
(unsigned long long)then,
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
t->tm_hour, t->tm_min, t->tm_sec);
Разница в том, что localtime()
возвращает указатель на статически выделенный буфер, и другой вызов к нему (даже в другом потоке) перезапишет содержимое. POSIX.1 localtime_r()
принимает второй параметр, указатель на struct tm
, где вместо этого сохраняется результат.