Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用<;的有效日期函数;ctime>;mktime_C++_Date_Mktime_Ctime - Fatal编程技术网

C++ 使用<;的有效日期函数;ctime>;mktime

C++ 使用<;的有效日期函数;ctime>;mktime,c++,date,mktime,ctime,C++,Date,Mktime,Ctime,我想要一个函数,它可以接受日、月、年三个输入,并告诉我它是否有效。然后使用上的示例 我试图实现我的功能: 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; tim

我想要一个函数,它可以接受日、月、年三个输入,并告诉我它是否有效。然后使用上的示例

我试图实现我的功能:

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;
}
问题是函数返回的不是我想要的。 e、 我正在检查

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
if(ValidDate(4,132010))//输出有效
std::cout返回如下:

如果时间不能表示为
std::Time\t
对象,则在成功或
-1
时作为
std::Time\t
对象的自历元时间

定义如下:

能够表示时间的算术类型

尽管未定义,但它几乎始终是一个整数值,用于保存自UTC 1970年1月1日
00:00以来的秒数(不计算闰秒),对应于

因此,1920年12月31日不能被表示为一个
std::time\t
,因为它是在纪元之前


对于报告为有效的其他无效日期,
mktime
还声明:

允许[参数]中的值超出其正常范围

以下是以下示例:

#包括
#包括
#包括
int main()
{
std::time\u t t=std::time(空);
std::tm=*std::localtime(&t);

std::cout No我的意思是,我输入了所有无效的日期,但几乎所有的日期都被输出为有效。唯一有效的日期是无效的。那么其他所有日期呢,它们为什么有效?哦,你的意思是这个函数只检查年份吗?这样我就无法验证日期和月份了?@ShoaibHaider请看我的编辑。现在应该更清楚了。好的,它们是用于不同的它们允许范围外变量增加/减少日期,这使得
mktime
成为验证日期的错误工具。
#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';
}