我刚刚开始学习C++。在浏览本网站上的代码时,我遇到了一个验证用户输入日期的代码。但问题是它甚至可以采用未来的值,因此需要调整这个逻辑才能接受 DOB。所以我决定使用“time()”函数获取当前时间,然后将其与输入的日期进行比较。首先,我在代码中添加了两行(在下面的代码中注释的那些),它们是
time(&tNow);
和
const struct tm *now = localtime(&tNow);
这是我的代码:
#include <iostream>
#include <sstream>
#include <ctime>
using namespace std;
// function expects the string in format dd/mm/yyyy:
bool extractDate(const std::string& s, int& d, int& m, int& y){
std::istringstream is(s);
char delimiter;
if (is >> d >> delimiter >> m >> delimiter >> y) {
struct tm t = {0};
t.tm_mday = d;
t.tm_mon = m - 1;
t.tm_year = y - 1900;
t.tm_isdst = -1;
// normalize:
time_t when = mktime(&t);
time_t tNow;
// time(&tNow);
const struct tm *norm = localtime(&when);
// const struct tm *now = localtime(&tNow); /* when I uncomment this line the code
// does not accept future date */
// validate (is the normalized date still the same?):
return (norm->tm_mday == d &&
norm->tm_mon == m - 1 &&
norm->tm_year == y - 1900);
}
return false;
}
int main() {
std::string s("11/01/2015");
int d,m,y;
if (extractDate(s, d, m, y))
std::cout << "date "
<< d << "/" << m << "/" << y
<< " is valid" << std::endl;
else
std::cout << "date is invalid" << std::endl;
}
当我取消注释时const struct tm *now = localtime(&tNow);
,代码会为任何未来的日期值提供正确的输出作为“无效日期”......但为什么会发生这种情况。我得到正确的输出但我想知道为什么。