0

日、月、年の 3 つの入力を取り、それが有効かどうかを教えてくれる関数が必要でした。次に、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

なんで?ありがとう。編集: 入力されたすべての日付は、1920 年 31 月 12 日と 2010 年 4 月 9 日を除いて無効であり、出力は正しくありませんでした。

4

1 に答える 1

2

mktimeリターンは次のとおりです:

std::time_t成功した-1場合、または時間がオブジェクトとして表現できない場合のオブジェクトとしてのエポックからの時間std::time_t

std::time_tは次のように定義されます。

時間を表現できる算術型。

定義されていませんが、これはほとんどの場合、 からの秒数 (閏秒は数えません) を保持する整数値であり、POSIX 時間00:00, Jan 1 1970 UTCに対応します。

std::time_tしたがって、1920 年 12 月 31 日は、エポックの前の として表すことはできません。


有効と報告されている他の無効な日付については、次のように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

于 2014-05-02T17:32:56.573 に答える