В чем разница между clock_t, time_t и struct tm?
struct tm выглядит так:
struct 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;
};
Но как выглядят clock_t и time_t?
В чем разница между clock_t, time_t и struct tm?
struct tm выглядит так:
struct 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;
};
Но как выглядят clock_t и time_t?
time_t
— это абсолютное время, представленное как целое число секунд, прошедших с эпохи UNIX (полночь по Гринвичу, 1 января 1970 г.). Он полезен как недвусмысленное, простое в работе представление момента времени.
clock_t
- это относительное измерение времени, представленное целым числом тактов часов с некоторого момента времени (возможно, при загрузке компьютера, но нет никаких гарантий, так как оно может довольно часто сбрасываться). Тактов часов в секунду CLOCKS_PER_SEC
; значение этой константы может варьироваться в разных операционных системах, но обычно оно составляет около 100. Иногда оно используется для целей синхронизации, но не очень хорошо с этим справляется из-за относительно низкого разрешения. struct timeval
из gettimeofday
намного лучше подходит для целей тайминга.
struct tm
— календарная дата и время. Он может не представлять какой-либо реальный момент времени (например, у вас может быть struct tm
, указывающее, что сейчас 31 февраля или 0 декабря). Он не включает часовой пояс, поэтому он не является абсолютным. Обычно он используется при преобразовании в или из удобочитаемых представлений даты и времени.
time_t
может быть double
и ссылаться на другие эпохи, кроме 1 января 1970 года.
- person chux - Reinstate Monica; 03.03.2017
time_t
или значение типа, но UNIX это делает.
- person Qqwy; 23.03.2018
time_t
представляет текущее время — обычно количество секунд, прошедших с некоторой эпохи (например, с полуночи 1 января 1970 г.). Он предназначен для представления времени календаря/настенных часов, но при этом им легко манипулировать как единым простым арифметическим типом (например, difftime
может найти разницу между двумя указанными значениями времени).
clock_t
представляет количество процессорного времени, используемого с момента запуска процесса. Его можно преобразовать в секунды, разделив на CLOCKS_PER_SEC. Его реальная цель состоит в том, чтобы представить используемое процессорное время, а не время календаря/настенных часов.
struct tm
— это структура (с указанными членами), представляющая время календаря/настенных часов, разбитое на компоненты — год, месяц, день, час, минута, секунда и т. д. Она предназначена (в первую очередь) как внешний интерфейс, а time_t
предназначен в первую очередь для внутреннего использования, т. е. типичное использование заключается в том, что когда вы получаете дату/время из внешнего мира, вы помещаете компоненты в struct tm
и конвертируете его в time_t
для внутреннего хранения. Затем, когда вам нужно сделать что-то вроде отображения времени/даты, вы конвертируете time_t
в struct tm
. Подпрограммы, выполняющие эту манипуляцию, включают в себя достаточное количество интеллекта для таких вещей, как нормализация дат, поэтому дата вроде 30 February
будет преобразована в 2 March
(или в високосном году 1 March
).
C просто говорит, что:
(C99, 7.23.1p3) «clock_t и time_t, которые являются арифметическими типами, способными представлять время»
В glibc
тип time_t
является псевдонимом long
.
В библиотеке GNU C time_t эквивалентно long int.
из http://www.gnu.org/software/libc/manual/html_node/Simple-Calendar-Time.html
time_t
в современных версиях является 64-битным числом (тогда как на многих платформах long
является только 32-битным), чтобы предотвратить Проблема 2038 года.
- person Qqwy; 23.03.2018