使用<ctime> mktime </ctime>的有效日期函数

时间:2014-05-02 16:58:55

标签: c++ date mktime ctime

我想要一个功能,它需要三天,一个月,一年的输入,并告诉我它是否有效。然后使用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之外,所有输入的日期均无效,且非输出数据是正确的。

1 个答案:

答案 0 :(得分:2)

mktime返回如下:

  

自纪元以来成为std::time_t成功对象的时间或-1如果时间无法表示为std::time_t对象。

std::time_t定义如下:

  

能够表示时间的算术类型。

     

虽然没有定义,但这几乎总是一个整数值,保持00:00, Jan 1 1970 UTC以来的秒数(不计算闰秒),对应POSIX time

所以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