Действительная функция даты с использованием & lt; ctime & gt; указываете ей

Мне нужна была функция, которая бы принимала три входа: день, месяц, год и сообщала мне, действительна ли она или нет. Затем, используя пример на http://www.cplusplus.com/reference/ctime/mktime/

Я пытался реализовать свою функцию:

bool ValidDate(int d, int m, int y)
{
struct tm *timeinfo;
time_t rawtime;
time (&rawtime);
timeinfo = localtime(&rawtime);
timeinfo->tm_year = y - 1900;
timeinfo->tm_mon = m - 1;
timeinfo->tm_mday = d;

if (mktime(timeinfo) == -1 )
return false;
else return true;
}

Проблема в том, что функция возвращается не так, как я хочу.
например, я проверяю как

if (ValidDate(4,13,2010)) // out put is valid
std::cout << "valid\n";
else std::cout << "Invalid\n";

ValidDate(4,22,2010) // valid
ValidDate(344,13,2010) //valid
ValidDate(4,133,2010) //valid
ValidDate(31,12, 1920) //invalid
ValidDate(31,9,2010) //valid
ValidDate(4,9,2010) //valid

Зачем? Благодарю.
РЕДАКТИРОВАТЬ:
все введенные даты были недействительными, за исключением 31,12,1920 и 4,9,2010, и ни один из результатов не был правильным.

0

Решение

mktime Возврат следующий:

Время с эпохи как std::time_t объект на успех или -1 если время не может быть представлено как std::time_t объект.

std::time_t определяется следующим образом:

Арифметический тип, способный представлять время.

Хотя это и не определено, это почти всегда интегральное значение, содержащее количество секунд (не считая високосных секунд), так как 00:00, Jan 1 1970 UTCсоответствует Время POSIX.

Таким образом, 31.12.1920 не может быть представлен в std::time_t как это было до эпохи.


Что касается других недействительных дат, которые сообщаются как действительные, mktime также говорится:

Значения в [параметре] могут быть вне их нормальных диапазонов.

Вот пример, взятый из cppreference :

#include <iostream>
#include <iomanip>
#include <ctime>

int main()
{
std::time_t t = std::time(NULL);
std::tm tm = *std::localtime(&t);
std::cout << "Today is           " << std::put_time(&tm, "%c %Z") <<'\n';
tm.tm_mon -= 100;  // tm_mon is now outside its normal range
std::mktime(&tm);
std::cout << "100 months ago was " << std::put_time(&tm, "%c %Z") << '\n';
}

Выход:

Today is Wed Dec 28 09:56:10 2011 EST
100 months ago was Thu Aug 28 10:56:10 2003 EDT

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector