Сравнить две даты - 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;
}
Объяснение кода листинга программы
- В функции
CheckDateиспользуются стандартные заголовочные файлыstdio.h,stdlib.h,string.hиtime.h. - Функция
CheckDateпринимает два аргумента: строку с датой и количество дней для добавления. - Результат проверки даты сохраняется в статическом массиве
resultтипаcharс фиксированным размером 8 символов. - Внутри функции инициализируются две переменные типа
time_t-currentиvalidate, которые используются для хранения текущего времени и времени, которое будет проверено. - Переменная
timeInfoинициализируется как указатель на структуруtmи используется для работы с датой. - С помощью функции
sscanfиз строкиdateStrсчитываются значения дня, месяца и года. - Значения месяца и года в структуре
tmуменьшаются на единицу, так как в C месяцы и годы хранятся от 0 до 11 и от 1900 до 2099 соответственно. - Значение дня в структуре
tmувеличивается на количество дней, переданных в функциюCheckDate. - С помощью функции
mktimeсоздается новое время, которое будет проверено. - С помощью функции
difftimeпроверяется, не превышает ли время, которое будет проверено, текущее время более чем на 0,0 секунды. - Если условие в пункте 10 выполняется, то в массив
resultзаписывается строкаGood, иначе записывается строкаBad. - В функции
mainвызывается функцияCheckDateс разными строками даты и количеством дней для добавления. - Результат проверки выводится на экран с помощью функции
printf. - В функции
mainне обрабатываются ошибки, поэтому программа может завершиться с ошибкой при попытке выполнить недопустимые действия (например, увеличить день месяца или год на 30 или 31).