Сравните время в C

Я пытаюсь сделать программу, которая распечатывает сообщения после определенной даты. Что-то вроде архива. Например, сегодня он должен распечатать только «привет». На следующий день он должен распечатать «мир». Но он все равно должен распечатать «привет», так как я уже прошел дату, когда «привет» уже должен быть напечатан.

Я уверен, что вы можете сделать это с некоторыми базовыми условиями if и просто сравнить значения внутри struct tm с локальным временем, но я думаю, что есть более быстрый и эффективный способ сделать это. Метод условия if также использует смехотворно длинный код. Я попытался просмотреть stackoverflow и нашел метод difftime. Проблема в том, что параметры difftime

double difftime(time_t time1, time_t time0)

и я не знаю, как инициализировать локальное время в одном из них и конкретную дату в другом.

Итак, короче, мои вопросы:

  1. Как установить конкретную дату в переменную time_t?

  2. Как мне установить переменную time_t в localtime (если вы собираетесь использовать метод struct tm localtime = *localtime(&time_t), не могли бы вы сказать мне, как преобразовать переменную struct обратно в переменную time_t, чтобы я мог вставить ее в параметры difftime)?


person Khalil Bigtas    schedule 11.05.2015    source источник
comment
Обратите внимание, что struct tm localtime = *localtime(&time_t); не является допустимым C. Вы можете использовать time_t whenever = 0; struct tm lt = *localtime(&whenever);, чтобы получить дату/время, близкие к эпохе Unix — 1970-01-01 00:00:00 +00:00 — или вы можете использовать более традиционный вариант и использовать time_t whenever = 0; struct time *lt = localtime(&whenever); (но вы можете предпочесть назначить, чтобы избежать проблем с другими вызовами функций преобразования времени, или вы можете использовать реентерабельные версии, такие как time_t whenever = 0; struct tm lt; localtime_t(&whenever, &lt);.   -  person Jonathan Leffler    schedule 11.05.2015


Ответы (1)


Отсутствует компонент mktime(), который преобразует struct tm обратно в time_t.

struct tm then;
then.tm_year = 2015 - 1900;
then.tm_mon  = 5 - 1;
then.tm_mday = 11;
then.tm_hour = 8;
then.tm_min  = 45;
then.tm_sec  = 0;
then.tm_dst  = -1;  // Undefined DST vs standard time

time_t now = mktime(&then);

struct tm *inverse = localtime(&now);

Вы можете жонглировать значениями в структуре, и mktime() их нормализует. Обратите внимание на шаткую кодировку лет и месяцев — пережиток далекого прошлого.

person Jonathan Leffler    schedule 11.05.2015