我想要一个函数,它可以接受天、月、年三个输入,并告诉我它是否有效。然后使用上的示例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 << "validn";
else std::cout << "Invalidn";
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,121920和4,92010外,所有输入的日期均无效,并且没有一个输出正确。
mktime
返回如下:
成功时自epoch起作为
std::time_t
对象的时间,如果时间不能表示为std::time_t
对象则为-1
。
std::time_t
定义如下:
能够表示时间的算术类型。
虽然没有定义,但这几乎总是一个积分值,它保持自
00:00, Jan 1 1970 UTC
以来的秒数(不计算闰秒(,对应于POSIX时间。
因此,1920年12月31日不能像历元之前那样表示为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