うるう年判定なども含めて、入力された日付や時刻が有効かをチェックする方法のメモ。
日付はQDateのコンストラクタに、年・月・日を入れて、isValid()で判定。
時刻はQTimeのコンストラクタに、時・分・秒を入れて、isValid()で判定。
日付
// true qDebug() << QDate(2019, 2, 28).isValid(); // うるう年ではないため、false qDebug() << QDate(2019, 2, 29).isValid(); // true qDebug() << QDate(2020, 2, 28).isValid(); // うるう年のため、true qDebug() << QDate(2020, 2, 29).isValid();
true false true true
時刻
// true qDebug() << QTime(23, 59, 59).isValid(); // true qDebug() << QTime(0, 0, 0).isValid(); // false qDebug() << QTime(25, 0, 0).isValid(); // false qDebug() << QTime(0, 60, 0).isValid(); // false qDebug() << QTime(0, 0, 60).isValid();
true true false false false
QDateTimeというのもあるけれど・・・
QDateTimeという、QDateとQTimeの両方を受け取るクラスもありますが、こちらは「日付が正常かつ、時刻が異常」の場合に、時刻を00:00:00にする(その結果、QDateTime::isValid()関数はtrueを返す)という仕様のため、時刻の有効性がチェックできません。
// true qDebug() << QDateTime(QDate(2019, 2, 28), QTime(23, 59, 59)).isValid(); // false qDebug() << QDateTime(QDate(2019, 2, 29), QTime(0, 0, 0)).isValid(); // 時刻が異常値でもtrue qDebug() << QDateTime(QDate(2019, 2, 28), QTime(23, 59, 60)).isValid(); // true qDebug() << QDateTime(QDate(2020, 2, 29), QTime(0, 0, 0)).isValid(); // 時刻が異常値でもtrue qDebug() << QDateTime(QDate(2020, 2, 29), QTime(-1, 0, 0)).isValid();
true false true true true