Сравнить две даты - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем привет, подскажите плиз чайнику как реализовать следующую задачку: пользователь должен ввести дату r (сохраняется в массив), так-же пользователь должен ввести скажем n-число дней (сохраняем в z прибавив к дате из массива r), затем полученную дату z нужно сравнить с текущей датой и если они совпадают или z больше вывести на экран статус Good в противном случае выводить Bad. Я пробовал сделать просто задав временной массив через: int day,mes,god - но все же хотелось более точной и автоматизированной системы расчетов этой самой даты (чтобы не было такого что к 18,02,2016 прибавив 20 дней получаем 38,02,2016 а не 09,03,2016)

Решение задачи: «Сравнить две даты»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
 
const char* CheckDate(const char* const dateStr, const int daysCount)
{
  static char result[8];
 
  time_t current;
  time_t validate;
 
  struct tm* timeInfo = NULL;
 
  time(¤t);
  time(&validate);
 
  timeInfo = localtime(¤t);
  sscanf(dateStr, "%d.%d.%d", &timeInfo->tm_mday, &timeInfo->tm_mon,
      &timeInfo->tm_year);
  timeInfo->tm_mon = timeInfo->tm_mon - 1;
  timeInfo->tm_year = timeInfo->tm_year - 1900;
  timeInfo->tm_mday = timeInfo->tm_mday + daysCount;
 
  validate = mktime(timeInfo);
 
  if (difftime(validate, current) >= 0.0)
  {
    strcpy(result, "Good");
  }
  else
  {
    strcpy(result, "Bad");
  }
 
  return (const char*) result;
}
 
int main(void)
{
  printf("%s\n", CheckDate("18.02.2016", 2));
  printf("%s\n", CheckDate("16.02.2016", 2));
  printf("%s\n", CheckDate("15.02.2016", 2));
  printf("%s\n", CheckDate("18.02.2016", 0));
  printf("%s\n", CheckDate("17.02.2016", 0));
 
  return 0;
}

Объяснение кода листинга программы

  1. В функции CheckDate используются стандартные заголовочные файлы stdio.h, stdlib.h, string.h и time.h.
  2. Функция CheckDate принимает два аргумента: строку с датой и количество дней для добавления.
  3. Результат проверки даты сохраняется в статическом массиве result типа char с фиксированным размером 8 символов.
  4. Внутри функции инициализируются две переменные типа time_t - current и validate, которые используются для хранения текущего времени и времени, которое будет проверено.
  5. Переменная timeInfo инициализируется как указатель на структуру tm и используется для работы с датой.
  6. С помощью функции sscanf из строки dateStr считываются значения дня, месяца и года.
  7. Значения месяца и года в структуре tm уменьшаются на единицу, так как в C месяцы и годы хранятся от 0 до 11 и от 1900 до 2099 соответственно.
  8. Значение дня в структуре tm увеличивается на количество дней, переданных в функцию CheckDate.
  9. С помощью функции mktime создается новое время, которое будет проверено.
  10. С помощью функции difftime проверяется, не превышает ли время, которое будет проверено, текущее время более чем на 0,0 секунды.
  11. Если условие в пункте 10 выполняется, то в массив result записывается строка Good, иначе записывается строка Bad.
  12. В функции main вызывается функция CheckDate с разными строками даты и количеством дней для добавления.
  13. Результат проверки выводится на экран с помощью функции printf.
  14. В функции main не обрабатываются ошибки, поэтому программа может завершиться с ошибкой при попытке выполнить недопустимые действия (например, увеличить день месяца или год на 30 или 31).

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы