Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
/* Для краткости проверка ошибок опущена */time_t now, then, some_time;time(&now); /* Получить текущее время */then = now - (6L * 31 * 24 * 60 * 60); /* Примерно 6 месяцев назад *//* ...установить какое-нибудь время, например, через stat()... */if (some_time < then) /* более 6 месяцев назад */else /* менее 6 месяцев назад */Однако, поскольку переносимый код может потребоваться запустить на не-POSIX системах, существует функция
difftime()difftime()time_t now, some_value;const double six_months = 6.0 * 31 * 24 * 60 * 60;time(&now); /* Получить текущее время *//* ...установить какое-нибудь время, например, через stat()... */if (difftime(now, some_time) >= six_months) /* более 6 месяцев назад */else /* менее 6 месяцев назад */Возвращаемым типом
difftime()doubletime_tВ обоих предыдущих примерах обратите внимание на использование типизированных констант, чтобы форсировать выполнение вычислений с нужным математическим типом:
6Llong6.1.2. Разложение времени:
gmtime()localtime()На практике форма представления даты и времени в виде «секунд с начала эпохи» не является очень удобной, кроме очень простых сравнений. Самостоятельное вычисление компонентов времени, таких, как месяц, день, год и т.д., подвержено ошибкам, поскольку необходимо принять во внимание местный часовой пояс (возможно, с учетом перехода на летнее время), правильно вычислить високосные годы и пр. К счастью, две стандартные процедуры делают за вас эту работу:
#include <time.h> /* ISO С */struct tm *gmtime(const time_t *timep);struct tm *localtime(const time_t *timep);gmtime()struct tmlocaltime()struct tmОбе функции возвращают указатель на
struct tmstruct tm { int tm_sec; /* секунды */ int tm_min; /* минуты */ int tm_hour; /* часы */ int tm_mday; /* день месяца */ int tm_mon; /* месяц */ int tm_year; /* год */ int tm_wday; /* день недели */ int tm_yday; /* день в году */ int tm_isdst; /* летнее время */};struct tmtime_tТаблица 6.1. Поля структуры
tm| Член | Диапазон | Значение |
|---|---|---|
tm_sec | 0–60 | Секунда минуты. Секунда 60 предусматривает пропущенные (leap) секунды. (В C89 был диапазон 0–61.) |
tm_min | 0–59 | Минута часа. |
tm_hour | 0–23 | Час дня |
tm_mday | 1–31 | День месяца |
tm_mon | 0–11 | Месяц года |
tm_year | 0–N | Год, начиная с 1900 г. |
tm_wday | 0–6 | День недели, воскресенье = 0 |
tm_yday | 0–365 | День года, 1 января = 0. |
tm_isdst | <0, 0, >0 | Флаг летнего времени. |
Стандарт ISO С представляет большинство этих значений как «
xytm_sectm_montm_wdaytm_mday