C++ 如何检查日期是否合法

10

有没有函数可以检查给定的日期是否有效?我不想从头开始编写。

例如,32/10/2012是无效的,而10/10/2010是有效的。


这个值从哪里来?它被用来做什么? - Jim Fell
我只是想检查输入是否有效。 - MBZ
4个回答

7
如果您的字符串格式始终如此,最简单的方法是将字符串拆分为其三个组件,填充一个 tm 结构,并将其传递给 mktime()。如果返回值为-1,则不是有效日期。
您也可以使用 Boost.Date_Time 进行解析:
string inp("10/10/2010");
string format("%d/%m/%Y");
date d;
d = parser.parse_date(inp, format, svp);

2
SVP和解析器是什么? - q0987
1
mktime函数将规范化一个日期。例如,如果日期中的天数为负数,它会回到上个月并相应地调整天数和月份成员。 - Cemafor
4
mktime:时间中的值可以超出其正常范围。 - bartolo-otrit
请在您的代码中添加完整的头文件和类型定义。 - Yen Dang

4

1
或者使用当前版本,http://www.boost.org/doc/libs/1_48_0/doc/html/date_time.html。 - Fred Larson
啊,是的,请让我编辑我的帖子以反映出来。谢谢Fred。 - Alikar
或者我确定的当前发布链接。 :) 谢谢 Vlad。 - Alikar

3
如果日期的格式是固定的,并且您不想使用boost,您可以始终使用ctime头文件中定义的strptime函数:
const char date1[] = "32/10/2012";
const char date2[] = "10/10/2012";
struct tm tm;

if (!strptime(date1, "%d/%m/%Y", &tm)) std::cout << "date1 isn't valid\n";
if (!strptime(date2, "%d/%m/%Y", &tm)) std::cout << "date2 isn't valid\n";

1
请注意,strptime() 是一个非标准扩展,不是所有系统(包括Windows)都可用。 - spencercw
1
@spencercw:确实如此。然而,大多数系统都有开源实现,包括Windows。此外,这是POSIX标准。 :) - netcoder

1

最近我遇到了一个类似的问题,但不幸的是没有找到boost的解决方法,mktime也没有解决我的问题。所以我决定手动检查日期时间。希望能帮到别人。

 bool isDateAndtimeValid( std::vector<int> time ) {
    if( time[1]> 12) return false; //month
    if( time[2]> 31 ) return false; //day
    if( time[2] == 31 and ( time[1] == 4 or time[1] == 6 or time[1] == 9 or time[1] == 11 ) ) return false; //30 days in Apr, Jun, Sen, Nov
    if( time[1] == 2) {
      if( time[2] > 29 ) return false;
      if( time[2] == 29 and ( ( time[0]%100 )%4 != 0) ) return false;
    } //Feb
    if( time[3] > 23) return false; //hours
    if( time[4] > 59 ) return false; //min
    if( time[5] > 59) return false; //sec
    return true;
    }

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community
当这个问题被提出并回答时,还没有std::get_time。但是如果你今天遇到同样的问题,那就是你想要使用的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接