Сравнение значений time_t с использованием операторов сравнения

У меня есть 2 значения time_t, и я хочу узнать, какое из них больше.

time_t находится внутри __int64 на моей платформе. Могу ли я использовать операторы <, > и == для сравнения значений? Я не хочу знать разницу между двумя значениями времени.

Код будет работать только в Windows, поэтому переносимость меня не волнует.

Правильно ли сравнивать значения таким образом?


person 51k    schedule 08.08.2014    source источник
comment
Если вас не волнует переносимость и вы знаете, что time_t внутренне __int64, то в чем смысл вопроса? __int64 значения, безусловно, сопоставимы с операторами сравнения.   -  person user4815162342    schedule 08.08.2014
comment
Вы искали time_t в Google, прежде чем задать этот вопрос? Я сделал. Это был первым результатом. Он сказал мне все, что мне нужно было знать. Пожалуйста, изучите вопрос, прежде чем задавать вопросы по SO.   -  person Michael Dorst    schedule 10.08.2014
comment
@anthropomorphic я уже видел эту страницу, но я намеренно хотел спросить об этом, потому что эта страница не объясняет так много, как технари ниже..   -  person 51k    schedule 11.08.2014


Ответы (4)


В соответствии с разделом 7.27.1(3) стандарта C (на который в данном случае ссылается стандарт C++) time_t является реальным типом, который определен в >6.2.5(17) как целочисленный или плавающий тип.

Пока вы явно не предполагаете целые числа (т. Е. Выполняя time_t t; int x = t;), что может привести к потере точности, вы в безопасности.

EDIT: на самом деле я беру это обратно. Если вы перейдете по этой ссылке, сообщение №6, вы сможете прочитайте следующее:

Тот факт, что time_t является арифметическим, не означает, что он сохраняет время как монотонно увеличивающиеся значения для продвижения времени. На самом деле наша стандартная библиотека C не гарантирует, что t1 ‹ t2 для t2 позже, чем t1. Мы складываем ограниченный диапазон представляемых значений по-разному для разных систем.

P.J. Plauger
Dinkumware, Ltd.
http://www.dinkumware.com

Поскольку Dinkumware широко используется в системах Windows (хотя я не знаю, относится ли это также к стандартной библиотеке C++), я считаю это уместным.

tl;dr: Используйте std::difftime, как предложено в других ответах.

person filmor    schedule 08.08.2014
comment
Вероятно, существует довольно много кода, который сломается, если time_t вдруг станет структурой или массивом... - person Mats Petersson; 08.08.2014
comment
Ага, посмотрел. Согласно стандарту, это должен быть настоящий числовой тип, так что вы правы. - person filmor; 08.08.2014
comment
t0 < t1 безопасен, но стандарт не гарантирует его значимость. Смотрите мой ответ. - person Keith Thompson; 10.08.2014

Стандарт C (от которого C++ наследует определение time_t) говорит только, что time_t — это арифметический тип, способный представлять время. Ничего не говорится о том, как это делается. В принципе, реализация может определить значение time_t как количество секунд до некоторой будущей даты или закодировать месяц, день, год, часы, минуты и секунды в указанном порядке. Сравнение значений time_t гарантированно будет вести себя последовательно (например, t0 < t1 && t1 < t2 подразумевает t0 < t2), но результат сравнения не обязательно ничего не говорит о порядке представленных значений времени.

Чтобы быть на 100% переносимым, вы можете проверить результат difftime().

Но если вы готовы согласиться на 99-процентную переносимость, вы должны быть уверены, что сравнения работают, как и ожидалось (что t0 < t1 означает, что t0 предшествует t1 в реальном времени). Я никогда не слышал о реализации, где это не работает. Если он упадет, вы можете пожаловаться разработчикам, но вы не можете сказать, что они не соответствуют стандарту.

person Keith Thompson    schedule 10.08.2014

Да, вы можете использовать обычные сравнительные операторы в указанном вами ограниченном случае. Могут быть другие системы, в которых это не работает, но современные ОС Linux и Windows будут работать нормально для сравнения значений time_t.

person Mats Petersson    schedule 08.08.2014
comment
В соответствии со стандартом, цитируемым отредактированным ответом Filmor (по иронии судьбы, вызванным вашим комментарием), сравнение значений time_t всегда должно работать. Это делает утверждение в этом ответе, что могут быть другие системы, в которых это не работает, неверно. - person user4815162342; 08.08.2014
comment
@ user4815162342: Зависит от того, что вы подразумеваете под работой; см. мой ответ. - person Keith Thompson; 10.08.2014
comment
@KeithThompson Хорошо замечено, +1. Странно и удивительно, что стандарт позволяет реализации использовать time_t как нечто иное, чем подсчет единиц времени с эпохи, но формулировка ясна в 7.23.2.4#2 C99 и в 4.2.12.4 C89: Кодировка значения не указана. - person user4815162342; 10.08.2014

Предполагая, что time_t имеет достаточно высокое разрешение для вашего варианта использования, тогда да, вы можете. Если вам нужно более высокое разрешение и вас беспокоит только Windows, подумайте о переходе на функции Win32, работающие с типом FILETIME.

person Andy Brown    schedule 08.08.2014