Какой примитивный тип данных - time_t?

Я не знаю типа данных time_t. Это поплавок или что-то еще? Потому что, если я хочу отобразить его, мне нужен соответствующий ему тег для printf. Я могу обработать все остальное для отображения time_t, но мне нужно знать тип данных, который ему соответствует.


person Community    schedule 08.05.2010    source источник
comment
Здесь уже был дан ответ: stackoverflow.com/questions/471248/   -  person Firas Assaad    schedule 08.05.2010
comment
Для тех, кто попадает сюда и ищет, как распечатать time_t, то же самое обсуждение относится к clock_t и было сделано здесь.   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 05.10.2013
comment
@FirasAssaad Это ответ для Linux. этот пост не относится к ОС.   -  person chux - Reinstate Monica    schedule 30.03.2017


Ответы (4)


К сожалению, он не совсем портативный. Обычно это целое, но может быть любым "целым числом". или реально плавающего типа ".

person Matthew Flaschen    schedule 08.05.2010

Это зависит от платформы. Но вы можете привести его к известному типу.

printf("%lld\n", (long long) time(NULL));
person dan04    schedule 08.05.2010
comment
Предполагается, что платформа поддерживает (long long). Именно тогда, когда это не так, вам нужно знать, что time_t только 32-битный. - person Ian Goldby; 15.08.2012
comment
Также предполагается, что long long достаточно велик, чтобы вместить значение. В соответствии со стандартом time_t может быть количеством йокто-секунд с момента выхода в эфир первого эпизода Монти Пайтон (что сделает его больше 64 бит). - person skyking; 26.10.2016
comment
@skyking не врет. Для хранения такого значения вам понадобится как минимум 111-битное число (примерно 1,5e33). Пока они не включат long long long long в стандарт, вы можете подготовиться к будущему, сохраняя все свои time_t в uint64_t[2]. - person ; 16.02.2018

Вы можете использовать функцию difftime. Он возвращает разницу между двумя заданными значениями time_t, выходным значением является double (см. документацию по различию времени).

time_t actual_time;
double actual_time_sec;
actual_time = time(0);
actual_time_sec = difftime(actual_time,0); 
printf("%g",actual_time_sec);
person user2483388    schedule 04.03.2014

Вы всегда можете использовать что-то вроде mktime, чтобы создать известное время (полночь, вчера вечером), и использовать difftime, чтобы получить разницу во времени с двойной точностью между ними. Для независимого от платформы решения, если вы не углубитесь в детали своих библиотек, вы не добьетесь большего успеха. Согласно спецификации C, определение time_t определяется реализацией (это означает, что каждая реализация библиотеки может определять его так, как им нравится, если библиотечные функции, использующие его, ведут себя в соответствии со спецификацией).

При этом размер time_t на моей Linux-машине составляет 8 байтов, что предполагает длинный int или double. Так я и сделал:

int main()
{
    for(;;)
    {
        printf ("%ld\n", time(NULL));
        printf ("%f\n", time(NULL));
        sleep(1);
    }
    return 0;
}

Время, указанное в% ld, увеличивалось на единицу на каждом шаге, и каждый раз поплавок печатал 0,000. Если вы одержимы использованием printf для отображения time_ts, лучше всего попробовать свой собственный такой эксперимент и посмотреть, как он работает на вашей платформе и с вашим компилятором.

person Sniggerfardimungus    schedule 08.05.2010
comment
Я знаю, что ваш комментарий старый, но вам нужно использовать printf ("%f\n", (double) time(NULL));, потому что printf - это функция vararg. - person sjoelund.se; 15.01.2014