В чем разница между clock_t, time_t и struct tm?

В чем разница между 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?


person Cristi    schedule 02.09.2012    source источник


Ответы (3)


time_t — это абсолютное время, представленное как целое число секунд, прошедших с эпохи UNIX (полночь по Гринвичу, 1 января 1970 г.). Он полезен как недвусмысленное, простое в работе представление момента времени.

clock_t - это относительное измерение времени, представленное целым числом тактов часов с некоторого момента времени (возможно, при загрузке компьютера, но нет никаких гарантий, так как оно может довольно часто сбрасываться). Тактов часов в секунду CLOCKS_PER_SEC; значение этой константы может варьироваться в разных операционных системах, но обычно оно составляет около 100. Иногда оно используется для целей синхронизации, но не очень хорошо с этим справляется из-за относительно низкого разрешения. struct timeval из gettimeofday намного лучше подходит для целей тайминга.

struct tm — календарная дата и время. Он может не представлять какой-либо реальный момент времени (например, у вас может быть struct tm, указывающее, что сейчас 31 февраля или 0 декабря). Он не включает часовой пояс, поэтому он не является абсолютным. Обычно он используется при преобразовании в или из удобочитаемых представлений даты и времени.

person Community    schedule 02.09.2012
comment
представлен как целое число секунд с эпохи UNIX (полночь по Гринвичу, 1 января 1970 г.). является обычным, но не определяется C. time_t может быть double и ссылаться на другие эпохи, кроме 1 января 1970 года. - person chux - Reinstate Monica; 03.03.2017
comment
@chux Действительно. C не указывает эпоху time_t или значение типа, но UNIX это делает. - person Qqwy; 23.03.2018
comment
@Qqwy UNIX недостаточно указал диапазон типов, поэтому у нас есть проблема 2038 года, а также игнорируя эти настоящие, хотя и надоедливые, високосные секунды. - person chux - Reinstate Monica; 24.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).

person Jerry Coffin    schedule 02.09.2012

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

person ouah    schedule 02.09.2012
comment
+1 за то, что time_t - это псевдоним long, это нужно знать. - person Cristi; 03.09.2012
comment
Имейте в виду, что time_t в современных версиях является 64-битным числом (тогда как на многих платформах long является только 32-битным), чтобы предотвратить Проблема 2038 года. - person Qqwy; 23.03.2018