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

Posted

技术标签:

【中文标题】使用 <ctime> mktime 的有效日期函数【英文标题】:Valid Date function using <ctime> mktime 【发布时间】:2014-05-02 16:58:54 【问题描述】:

我想要一个函数,它接受日、月、年三个输入并告诉我它是否有效。然后使用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】:

mktime返回如下:

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

std::time_t 定义如下:

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

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

因此 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 EST100 months ago was Thu Aug 28 10:56:10 2003 EDT

【讨论】:

不,我的意思是,我输入了所有无效日期,但几乎所有日期都输出为有效日期。并且唯一有效的日期为无效。那么所有其他人呢,为什么它们是有效的? 哦,你的意思是这个功能只检查年份吗?那么我无法验证日期和月份? @ShoaibHaider 查看我的编辑。现在应该更清楚了。 好的,所以它们适用于不同的事物。它们允许超出范围的变量增加/减少日期 是的,这使得mktime 成为验证日期的错误工具。

以上是关于使用 <ctime> mktime 的有效日期函数的主要内容,如果未能解决你的问题,请参考以下文章

localtime和mktime

c mktime 在 Windows 和 GNU/Linux 上是不是不同?

c++ mktime和时间秒数的理解

C语言 ctime()

#include <ctime>在c 中是啥意思

如何正确使用 ctime() 打印不同的时间戳