Question

I wanted a function that would take three inputs of day, month, year and tell me whether it is valid or not. Then using the example on http://www.cplusplus.com/reference/ctime/mktime/

I tried to implement my function:

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;
}

The problem is that the function is returning not as i want it to. e.g im checking like

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

Why? thanks. EDIT: all dates entered were invalid except 31,12,1920 and 4,9,2010 and non of the outputs were correct.

Was it helpful?

Solution

mktime return is as follow :

Time since epoch as a std::time_t object on success or -1 if time cannot be represented as a std::time_t object.

std::time_t is defined as follow :

Arithmetic type capable of representing times.

Although not defined, this is almost always a integral value holding the number of seconds (not counting leap seconds) since 00:00, Jan 1 1970 UTC, corresponding to POSIX time.

So 31/12/1920 cannot be represented into a std::time_t as it is before the epoch.


As for the other invalid dates that are reported as valid, mktime also states :

The values in [the parameter] are permitted to be outside their normal ranges.

Here is the example taken from 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';
}

Output is :

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top