YYYYMMDDのような文字列が
正しい日付であるかどうかをチェックする方法がありますか?
たとえば
20010101⇒OK
20000001⇒NG
2001010A⇒NG
など
書式が常に YYYYMMDD の形式ならば簡単だと思います。
・年、月、日のそれぞれに分解
・それぞれが適切な範囲にあるかどうか検証
・日はうるう年に注意
そんなもん簡単に作れるでしょうに。
- 8桁であること
- 全部が数字であること。
- その月/その日が正当であること
(ただし2月に限りうるう年を考慮すべし)
これだけ。
# なくはないでしょう。
# struct tm につっこんで mktime呼べばいいんじゃないかしら(おそらく)
・文字列を分解して数値に変換し、CTimeに代入。
・CTime::Format( %Y%m%d )で日付の文字列を作る。
・元の文字列と一致していればOK。
という方法ではどうでしょう?
> 文字列を分解して数値に変換し、CTimeに代入。
CTime(2001,1,1,1,1,1)のように、インスタンスを生成するですか?
> # なくはないでしょう。
> # struct tm につっこんで mktime呼べばいいんじゃないかしら(おそらく)
struct tm when;
CString sTemp = 20010101;
when.tm_year = atoi(sTemp.Left(4));
when.tm_mon = atoi(sTemp.Mid(4,2));
when.tm_mday = atoi(sTemp.Mid(6,2));
mktime(&when);
time_t result;
if((result = mktime(&when)) != (time_t)-1 ){
printf(OK\n);
}else {
printf(error\n);
}
できました。
επιστημη さんありがとう。
ちなみに、名前どういう意味ですか?
> 文字列を分解して数値に変換し、CTimeに代入。
> CTime(2001,1,1,1,1,1)のように、インスタンスを生成するですか?
そういうことです。今日なら
CTime( 2004, 5, 27, 0, 0, 0 )
でしょうか。
正しくない日付を代入すると、CTimeのコンストラクタ内のASSERTでエラーになる。
たとえば:
CTime(2001,13,32,1,1,1)
> 正しくない日付を代入すると、CTimeのコンストラクタ内のASSERTでエラーになる。
> たとえば:
> CTime(2001,13,32,1,1,1)
そうですね。でもこの方法は、「struct tm につっこんで mktime呼ぶ」ではチェックし
きれない「2月29日」などには有効です。「20030229」と「20040229」で試してみてくだ
さい。違いが解ると思います。
επιστημηさんが提示してくれた方法でOKという結果がでたら、この方法でもう一度チェッ
クしてみるといいでしょう。余談ですが、
> when.tm_year = atoi(sTemp.Left(4));
> when.tm_mon = atoi(sTemp.Mid(4,2));
これでは不十分だと思います。
mktime()では「20040431」みたいに、小の月のチェックもしてくれません。
また、mktime()もCTimeも扱える年の範囲が狭いので、1970年以前の日付などもチェック
しなくてはならないようならば、ひと工夫必要です。
そーなるとゼラーの公式適用して自前でこさえちまったほうがいいんじゃないのか、と。
CTimeをつかうと、ASSERTでプログラムが終了するではないですか?
だからぁ、
επιστημηさんが提示してくれた方法でOKという結果がでたら、この方法でもう一度チェッ
クしてみるといいでしょう。
と書いたんですけど。
なるほど、今ちょっと試してみましたが、
> 佐倉 [E-Mail] 2004/05/27(木) 17:34:25
> CTime(2001,13,32,1,1,1)
この例ではmktime()はOKと判断するんですね。これではmktime()の判定結果をそのまま信
じてCTimeに渡すのは確かに危険です。
CTime::CTime(int...)のソースを見ると、
ASSERT(nDay >= 1 && nDay <= 31);
ASSERT(nMonth >= 1 && nMonth <= 12);
ASSERT(nYear >= 1900);
となっていますので、この範囲チェックを行ってからCTimeに渡すようにするとか。
ぜらーさんは 1583年 ~ 3999年までしか使えないとか。
せっかく MFC 使うなら COleDateTime 使っちまいなっ!